1

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

4

1 回答 1

4

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

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

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

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;

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

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

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

给定一个 list l,如果你想对 list 的每个元素做一些事情,你可以尝试使用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 的参数。

于 2013-11-13T04:45:33.913 回答