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

Я создал функцию в 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 может быть дополнительно обновлен. Этот код дает мне синтаксис ошибки. В конце должен быть напечатан последний минимум, поэтому я думаю, что это должно быть что-то вроде глобального значения (?). Как я могу это сделать?

Введение в одну из самых важных концепций в React - функциональное программирование
Введение в одну из самых важных концепций в React - функциональное программирование
React разработан с использованием концепции функционального программирования, поэтому понимание функционального программирования важно для изучения...
Фото ️🔁 Radek Jedynak 🔃 on ️🔁 Unsplash 🔃
Фото ️🔁 Radek Jedynak 🔃 on ️🔁 Unsplash 🔃
Что такое Java 8 Streams API? Java 8 Stream API
0
0
117
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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]

Избегать...

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

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

user10971030 02.04.2019 15:02

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

sshine 03.04.2019 08:06

Другие вопросы по теме