我有一个int ref的列表,我的函数需要。我怎么能增加列表头部的int,然后递减尾部? ML可以为每个函数执行多行(看起来我只能做一个语句(比如if..else ..)并在其下写下其他子句/代码而不会出错)。
答案 0 :(得分:4)
如果您提供了更多信息,那将非常有帮助,但我至少可以解释一般概念是如何运作的。
ML使用;
字符构建单个表达式中的两个。给定两个表达式e1
和e2
,您可以创建表达式(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的参数可以适当改变。