更新函数内的变量

Updating a variable inside a function

我在 SML 中创建了一个遍历列表起始元素的函数,如果第一个、第二个、第三个.. 元素相同,则删除这些元素并更新变量的 value.What 我写过:

 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

这个函数的输出是一个包含我提到的元素的列表 deleted.For 例如,如果它得到这个列表作为输入->[1,1,1,1,2,3,4 ] 并且 min 设置为 7,之前我期望它给出 [2,3,4] 作为结果并且 min 更新为 4.The 应该存储 min 变量,因为这个函数可能会再次调用并且 min 可能进一步 updated.This 代码给了我语法 errors.At 最后的最小值必须被打印所以我认为这必须是一个全局值(?)。我怎么能做到这一点?

traverses the starting elements of a list and if first,second,third.. element are the same deletes these elements

如果 "first,second,third.." 你的意思是任意多,那么这就是你想要做的:

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 ...是声明,let只能有inend之间的表达式. (另一件事是 local ... in ... end,但你仍然不想这样做。没有意义。)
  3. 使用 hdtl。在输入列表的元素(x::xsx::y::zs)上使用模式匹配。