Обновление переменной внутри функции

#functional-programming #sml #smlnj

#функциональное программирование #sml #smlnj

Вопрос:

Я создал функцию в SML, которая обходит начальные элементы списка и, если первый, второй, третий.. элемент одинаковый удаляет эти элементы и обновляет значение переменной.Что я написал:

  let
    val min=7
 in
    fun seen2 (set:int list) =
    if hd set=hd(tl set) then 
    min=min-1
    seen2(tl set)  
    else 
    tl set
    end
  

Вывод этой функции должен представлять собой список с удаленными элементами, о которых я упоминал.Например, если он получает этот список в качестве входных данных ->[1,1,1,1,2,3,4], а значение min задано как 7, прежде чем я ожидаю, что оно выдаст [2,3,4] в результате, а значение min будет обновлено до 4.Переменная min должна быть сохранена, потому что эта функция, вероятно, будет вызвана снова, и min может быть дополнительно обновлен.Этот код выдает синтаксические ошибки.В конце должно быть напечатано последнее минимальное значение, поэтому я думаю, что это должно быть что-то вроде глобального значения (?).Как я мог бы это сделать?

Ответ №1:

обходит начальные элементы списка и, если первый, второй, третий.. элемент одинаковый удаляет эти элементы

Если по «первому, второму, третьему…» вы имеете в виду произвольно много, тогда это то, что вы хотите делать:

 fun removeDuplicatesBeginning [] = []
  | removeDuplicatesBeginning (x::y::zs) =
      if (* are the first two elements the same? *)
      then (* apply removeDuplicatesBeginning recursively
              to sub-list with one of them removed *)
      else (* no repeats, we're done recursing, only remove first element *)
  

Выразите желаемое поведение с помощью тестов, например

 val test_1 = removeDuplicatesBeginning [1,1,1,1,2,3,4] = [2,3,4]
  

И не забывайте о угловых примерах, например

 val test_2 = removeDuplicatesBeginning [2,3,4] = [3,4]
val test_3 = removeDuplicatesBeginning [1,2,1] = [2,1]
  

Избегайте…

  1. установка элементов в начале, например let val min = 7 in ... end . В этом нет смысла.
  2. Вы не можете писать, let ... in fun ... end потому что fun ... это объявление, и у вас могут быть выражения только между in и end для let . (Другая вещь возможна с local ... in ... end , но вы все еще не хотите этого делать. В этом нет смысла.)
  3. использование hd и tl . Используйте сопоставление с шаблоном для элементов входного списка ( x::xs , или x::y::zs ).

Комментарии:

1. Спасибо вам, сэр, за то, что показали мне правильный способ сделать это с помощью сопоставления с образцом. Однако я хочу использовать min, потому что это часть более крупной программы, но с локальной, которую вы предложили, у меня есть ошибки. что я могу сделать?

2. @Leopardard: Но вы не говорите, что min должно содержаться. Я бы предположил, что она будет содержать некоторое минимальное значение, но на самом деле, ваши только два примера показывают, что это самые большие значения в ваших примерах, которые сохраняются в min . Итак, почему бы вам немного не пояснить, для чего предназначено это значение? Удаляется не элемент, и это не минимальный элемент, и это не последний элемент, и это не количество элементов. У меня действительно не хватает идей здесь. 🙂