обходит начальные элементы списка и, если первый, второй, третий .. элементы одинаковы, удаляет эти элементы
Если "первым, вторым, третьим .." выозначает произвольно много, тогда это то, что вы хотите делать:
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
).