(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
最后请注意,在大多数情况下,您不需要 null
或 head
等函数,因为我们编写的函数具有模式匹配构造。这极大地增强了可读性,而且通常情况下它会抑制对此类功能的需求。例如,addto
可以更简单地重写为:
fun addto ([], _) = []
| addto (x :: tl, v) = (x + v) :: addto (tl, v)
是不是更简单?
- 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);
到底是什么意思?
我认为“缺点”运算符 ::
必须定义如下:
这里我的伪名
但是在我的函数中我们有短语 (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)
是不是更简单?