#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]
Избегайте…
- установка элементов в начале, например
let val min = 7 in ... end
. В этом нет смысла. - Вы не можете писать,
let ... in fun ... end
потому чтоfun ...
это объявление, и у вас могут быть выражения только междуin
иend
дляlet
. (Другая вещь возможна сlocal ... in ... end
, но вы все еще не хотите этого делать. В этом нет смысла.) - использование
hd
иtl
. Используйте сопоставление с шаблоном для элементов входного списка (x::xs
, илиx::y::zs
).
Комментарии:
1. Спасибо вам, сэр, за то, что показали мне правильный способ сделать это с помощью сопоставления с образцом. Однако я хочу использовать min, потому что это часть более крупной программы, но с локальной, которую вы предложили, у меня есть ошибки. что я могу сделать?
2. @Leopardard: Но вы не говорите, что
min
должно содержаться. Я бы предположил, что она будет содержать некоторое минимальное значение, но на самом деле, ваши только два примера показывают, что это самые большие значения в ваших примерах, которые сохраняются вmin
. Итак, почему бы вам немного не пояснить, для чего предназначено это значение? Удаляется не элемент, и это не минимальный элемент, и это не последний элемент, и это не количество элементов. У меня действительно не хватает идей здесь. 🙂