【问题标题】:ML Increment Integer RefML 增量整数参考
【发布时间】:2013-11-13 04:08:58
【问题描述】:

我有一个我的函数需要的 int ref 列表。我怎样才能增加列表头部的 int,然后在尾部递归? ML 能否为每个函数执行多行(似乎我只能执行一条语句(如 if..else..)并在其下编写其他子句/代码而不会出错)。

【问题讨论】:

    标签: integer increment sml ml ref


    【解决方案1】:

    如果您提供更多信息会很有帮助,但我至少可以解释一下总体思路是如何运作的。

    ML 使用; 字符从两个表达式中构建一个表达式。给定两个表达式e1e2,您可以创建表达式(e1 ; e2)(括号不是可选的——没有它们就无法工作),它将评估e1e2 中的所有内容,并且如果e2 具有值,则具有与e2 相同的值。

    这有点抽象,这里举几个例子:

    val a_ref = ref 0;
    fun f x = (x := !x + 1; !x);
    f a_ref;
    

    这会将a_ref 中的值设置为1,然后返回该值。

    保持相同的 ref,但定义一个新函数:

    fun g x = (x := !x + 1; x := (if !x == 2 then 0 else 1); 42);
    g a_ref;
    

    这将首先增加 a_ref 中的值(到 2),然后检查它是否等于 2,然后将其设置为零,然后返回 42。

    希望这些能帮助您了解; 的工作原理。

    现在,继续你真正想要的:

    给定一个列表l,如果你想对列表中的每个元素做一些事情,你可以尝试使用app。例如:

    app (fn x => x := !x + 1) l;
    

    将递增列表中的每个引用。

    或者,如果你想使用递归,

    fun f [] = []
      | f (x::xs) = (x := !x + 1; x::(f xs))
    

    这将增加每个 refs,然后返回列表。如果您不想返回列表,

    fun f [] = ()
      | f (x::xs) = (x := !x + 1; f xs);
    

    是另一种选择,它将改为提供unit

    如果你想做一些比增加每个元素更复杂的事情,可以适当地改变 f 的参数。

    【讨论】:

    • “括号不是可选的——没有它们就行不通”这并不完全正确。如果let 的主体是; 表达式,则括号是可选的。
    猜你喜欢
    • 2017-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-30
    • 1970-01-01
    • 2014-10-26
    • 1970-01-01
    相关资源
    最近更新 更多