Functional programming 更新函数中的变量

Functional programming 更新函数中的变量,functional-programming,sml,smlnj,Functional Programming,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 此函数的输出是一个删除了我提到的元素的列表。例如,如果它将此列表作为输入

我在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],并且在我给出[2,3,4]之前将min设置为7因此,min to更新为4。应该存储min变量,因为此函数可能会再次调用,min可能会进一步更新。此代码给我语法错误。最后必须打印最后的min,因此我认为这必须是一个全局值(?)。我如何才能做到这一点

遍历列表的起始元素,如果是第一个、第二个、第三个。。元素相同,删除这些元素

如果你所说的“第一、第二、第三…”是指任意多个,那么这就是你想要做的:

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
    ,因为
    fun…
    是一个声明,对于
    let
    ,只能在
    中的
    end
    之间使用表达式。(另一件事可以通过
    local…in…end
    ,但您仍然不想这样做。这没有意义。)
  • 使用
    hd
    tl
    。在输入列表的元素上使用模式匹配(
    x::xs
    ,或
    x::y::zs
  • 遍历列表的起始元素,如果是第一个、第二个、第三个。。元素相同,删除这些元素

    如果你所说的“第一、第二、第三…”是指任意多个,那么这就是你想要做的:

    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
    ,因为
    fun…
    是一个声明,对于
    let
    ,只能在
    中的
    end
    之间使用表达式。(另一件事可以通过
    local…in…end
    ,但您仍然不想这样做。这没有意义。)
  • 使用
    hd
    tl
    。在输入列表的元素上使用模式匹配(
    x::xs
    ,或
    x::y::zs

  • 先生,谢谢您向我展示了使用模式匹配的正确方法。但是我想使用min,因为这是一个更大程序的一部分,但是对于本地程序,您建议我有错误。我能做什么?@Leopard:但是您没有说
    min
    应该包含什么。我假设它包含一些最小值,但事实上,您仅有的两个示例表明,它是示例中存储到
    min
    的最大值。那么为什么不详细说明一下这个值的用途呢?它不是被移除的元素,也不是最小元素,也不是最后一个元素,也不是元素的数量。我这里真的没有什么想法了。:)先生,谢谢您向我展示了使用模式匹配的正确方法。但是我想使用min,因为这是一个更大程序的一部分,但是对于本地程序,您建议我有错误。我能做什么?@Leopard:但是您没有说
    min
    应该包含什么。我假设它包含一些最小值,但事实上,您仅有的两个示例表明,它是示例中存储到
    min
    的最大值。那么为什么不详细说明一下这个值的用途呢?它不是被移除的元素,也不是最小元素,也不是最后一个元素,也不是元素的数量。我这里真的没有什么想法了。:)