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

What does (l+v) :: ...(list + integer :: (cons operand) ..) mean in 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,3],~2);
val it = [~1,0,1] : int list

这是我幻灯片中的一个 SML 函数。我不明白 (l+v) 在这里如何工作。 但它确实有效:

addto ([1,2,3],2);
val it = [3,4,5] : int list

我认为它是这样的:

   addto([1,2,3],2);  
   addto([2,3], 2);  
   addto([3], 2);   
   addto([],2)

现在它实际上是 l nill 所以它 returns 它添加到 ([3], 2);
但是 hd l + v :: addto (tl l,v); 到底是什么意思? 我认为“缺点”运算符 :: 必须定义如下: ::
这里我的伪名 实际上是示例中的整数 addto([1,2,3],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)

是不是更简单?