ML增量整数参考

时间:2013-11-13 04:08:59

标签: integer increment sml ml ref

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

1 个答案:

答案 0 :(得分:4)

如果您提供了更多信息,那将非常有帮助,但我至少可以解释一般概念是如何运作的。

ML使用;字符构建单个表达式中的两个。给定两个表达式e1e2,您可以创建表达式(e1 ; e2)(括号不是可选的 - 如果没有它们将无法工作),它将评估{{1}中的所有内容}然后e1,如果e2有值,则其值与e2相同。

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

e2

这会将val a_ref = ref 0; fun f x = (x := !x + 1; !x); f a_ref; 中的值设置为1,然后返回该值。

保持相同的参考,但定义一个新功能:

a_ref

这将首先递增fun g x = (x := !x + 1; x := (if !x == 2 then 0 else 1); 42); g a_ref; (到2)中的值,然后检查它是否等于2,然后将其设置为零,然后返回42.

希望这些有助于您理解a_ref的工作原理。

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

给定列表;,如果您想对列表的每个元素执行某些操作,可以尝试使用l。例如:

app

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

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

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

这将递增每个引用,然后返回列表。如果您不想返回列表,

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

是另一种选择,它会改为fun f [] = () | f (x::xs) = (x := !x + 1; f xs);

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