(l+v) :: ...(list + integer :: (cons operation) ..) 在 SML 中是什么意思?

问题描述

- 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); 是什么意思? 我认为“缺点”运算符 :: 必须定义为: ::
在这里,我的伪名 实际上是带有 addto([1,2) 的示例中的整数。
但是在我的函数中,我们有短语 (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

最后,请注意,在大多数情况下,您不需要 nullhead 之类的函数,因为我们编写的函数具有模式匹配构造。这极大地提高了可读性,并且通常情况下它会抑制对此类功能的需求。例如,addto 可以更简单地重写为:

fun addto ([],_) = []
  | addto (x :: tl,v) = (x + v) :: addto (tl,v)

不是更简单吗?