【问题标题】:Updating a variable inside a function更新函数内的变量
【发布时间】:2019-08-22 21:24:37
【问题描述】:

我在 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 可能会进一步更新。此代码给我语法错误。最后必须打印最后的最小值,所以我认为这必须是一个全局值(?)。我怎么能做到这一点?

【问题讨论】:

    标签: functional-programming sml smlnj


    【解决方案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]
    

    避免...

    1. 在开头设置元素,如let val min = 7 in ... end。没有意义。
    2. 你不能写let ... in fun ... end,因为fun ...是一个声明,对于let,你只能在inend之间有表达式。 (另一件事可以使用local ... in ... end,但您仍然不想这样做。没有意义。)
    3. 使用hdtl。对输入列表的元素使用模式匹配(x::xsx::y::zs)。

    【讨论】:

    • 感谢先生向我展示了使用模式匹配的正确方法。但是我想使用 min 因为这是一个更大的程序的一部分但是你建议我有错误的本地我可以吗?
    • @Leopardard:但你没有说min 应该包含什么。我假设它会包含一些 minimal 值,但事实上,您仅有的两个示例表明它是您的示例中的 largest 值存储到min。那么为什么不详细说明这个值的目的是什么?被移除的不是元素,也不是最小元素,也不是最后一个元素,也不是元素的数量。我在这里真的缺乏想法。 :)
    猜你喜欢
    • 2022-11-21
    • 2020-04-22
    • 1970-01-01
    • 2021-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-02
    • 1970-01-01
    相关资源
    最近更新 更多