Обновление переменной внутри функции - PullRequest
1 голос
/ 01 апреля 2019

Я создал функцию в 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 Ответ

3 голосов
/ 02 апреля 2019

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

Если "первым, вторым, третьим .." выозначает произвольно много, тогда это то, что вы хотите делать:

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).
...