Я создал функцию в 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
Вывод этой функции должен быть списком с элементами, которые я упомянул, удаленными. Например, если он получает этот список как input-> [1,1,1,1,2,3,4], а min установлен как 7 до того, как я ожидаю, что в результате он даст [2,3,4], а min будет обновлен до 4. Переменная min должна быть сохранена, потому что эта функция, вероятно, будет вызываться снова, и min может быть дополнительно обновлен. Этот код дает мне синтаксис ошибки. В конце должен быть напечатан последний минимум, поэтому я думаю, что это должно быть что-то вроде глобального значения (?). Как я могу это сделать?
traverses the starting elements of a list and if first,second,third.. element are the same deletes these elements
Если под "первым, вторым, третьим..." вы подразумеваете произвольное количество, то это то, что вы хотите делать:
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]
Избегать...
let val min = 7 in ... end
. Нет никакого смысла.let ... in fun ... end
, потому что fun ...
— это объявление, и вы можете иметь выражения только между in
и end
для let
. (Другое возможно с local ... in ... end
, но вы все равно не хотите этого делать. Нет смысла.)hd
и tl
. Используйте сопоставление с образцом для элементов входного списка (x::xs
или x::y::zs
).@Leopard: Но вы не говорите, что должно содержаться в min
. Я бы предположил, что он будет содержать какое-то значение минимальный, но на самом деле только два ваших примера показывают, что именно значения самый большой в ваших примерах сохраняются в min
. Так почему бы вам немного не уточнить, для чего предназначено это значение? Удаляется не элемент, и не минимальный элемент, и не последний элемент, и не количество элементов. Мне действительно не хватает идей здесь. :)
Спасибо, сэр, за то, что показали мне правильный способ сделать это с помощью сопоставления с образцом. Однако я хочу использовать min, потому что это часть более крупной программы, но с локальным, который вы предложили, у меня есть ошибки. Что я могу сделать?