【发布时间】:2013-11-13 04:08:58
【问题描述】:
我有一个我的函数需要的 int ref 列表。我怎样才能增加列表头部的 int,然后在尾部递归? ML 能否为每个函数执行多行(似乎我只能执行一条语句(如 if..else..)并在其下编写其他子句/代码而不会出错)。
【问题讨论】:
标签: integer increment sml ml ref
我有一个我的函数需要的 int ref 列表。我怎样才能增加列表头部的 int,然后在尾部递归? ML 能否为每个函数执行多行(似乎我只能执行一条语句(如 if..else..)并在其下编写其他子句/代码而不会出错)。
【问题讨论】:
标签: integer increment sml ml ref
如果您提供更多信息会很有帮助,但我至少可以解释一下总体思路是如何运作的。
ML 使用; 字符从两个表达式中构建一个表达式。给定两个表达式e1 和e2,您可以创建表达式(e1 ; e2)(括号不是可选的——没有它们就无法工作),它将评估e1 和e2 中的所有内容,并且如果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 的主体是; 表达式,则括号是可选的。