问题描述
- fun addto (l,v) =
= if null l then nil
= else hd l + v :: addto (tl l,v);
val addto = fn : int list * int -> int list
addto ([1,2,3],2);
val it = [3,4,5] : int list
- addto ([1,~2);
val it = [~1,1] : int list
这是我幻灯片中的一个 SML 函数。我不明白 (l+v) 如何在这里工作。 但它确实有效:
addto ([1,5] : int list
我认为它是这样的:
addto([1,2);
addto([2,2);
addto([3],2);
addto([],2)
现在它实际上是 l nill,所以它返回给 addto([3],2);
但无论如何 hd l + v :: addto (tl l,v);
是什么意思?
我认为“缺点”运算符 ::
必须定义为:
在这里,我的伪名
但是在我的函数中,我们有短语 (l+v :: ..) 而 l 是一个列表,v 是一个 int 那么什么是 l+v
?
p.s我是一个完整的初学者所以如果它太简单了请原谅我
解决方法
第一个 ::
定义为:
datatype 'a list = nil | :: of 'a * 'a list
例如,1 :: [2,3]
是列表 [1,2,3]
。
然后在您的代码中,您的表达式被解释为:
((hd l) + v)) :: (addto (tl l,v))
所以基本上,你的函数可以重写如下:
fun addto (l,v) =
if null l then nil (* if l is empty the result is the empty list *)
else let
val head = hd l (* take the first element of list l *)
val sum = head + v (* then add it v *)
val result_tail = addto (tl l,v) (* and compute x + v for all x in the tail of my list *)
in
sum :: result_tail (* the result is the sum I just computed followed by what the recursive call gave me *)
end
最后,请注意,在大多数情况下,您不需要 null
或 head
之类的函数,因为我们编写的函数具有模式匹配构造。这极大地提高了可读性,并且通常情况下它会抑制对此类功能的需求。例如,addto
可以更简单地重写为:
fun addto ([],_) = []
| addto (x :: tl,v) = (x + v) :: addto (tl,v)
不是更简单吗?