SML 中 List.nth 内部实际发生了什么?
What is actually happening inside List.nth in SML?
有人可以帮助我理解 SML 中的 List.nth 吗?
它从列表中输出指定的元素。
一)
List.nth ([7,3,6,1],0);
val it = 7 : int
b)
List.nth ([7,3,6,1],1);
val it = 3 : int
例如:
- 使用递归实现 map 函数为:
趣味地图_nil = nil
|地图 f (a::b) = (f a) :: (地图 f b);
- 使用递归实现 foldr 函数为:
fun foldr _ c nil = c
| foldr f c (a::b) = f(a, foldr f c b);
同样,List.nth.
内部实际发生的事情
nth (l, i)
returns 列表 l
的第 i
(th) 个元素,从 0 开始计数。换句话说,它正在访问 [=12= 中的元素] 按索引 i
.
在示例“a”中 List.nth([7,3,6,1], 0)
returns l
中的第 i
(th) 个元素是 7
在示例“b”中 List.nth([7,3,6,1], 1)
returns l
中的第 i
(th) 个元素是 3
List.nth
的简单实现如下所示,使用模式匹配和 option
类型来处理越界错误。
fun nth([], _) = NONE
| nth(x::_, 0) = SOME x
| nth(x::xs, i) = nth(xs, i - 1)
我们在空列表中寻找什么索引并不重要。没有。
如果索引是 0
,return 列表中的第一个元素。列表的其余部分是什么并不重要。
否则,对列表的其余部分调用 nth
并将索引减 1。
所以如果我们调用 nth([3, 7, 4, 1, 8], 3)
递归看起来像:
nth([3, 7, 4, 1, 8], 3)
nth([7, 4, 1, 8], 2)
nth([4, 1, 8], 1)
nth([1, 8], 0)
SOME 1
有人可以帮助我理解 SML 中的 List.nth 吗?
它从列表中输出指定的元素。 一)
List.nth ([7,3,6,1],0);
val it = 7 : int
b)
List.nth ([7,3,6,1],1);
val it = 3 : int
例如:
- 使用递归实现 map 函数为:
趣味地图_nil = nil |地图 f (a::b) = (f a) :: (地图 f b);
- 使用递归实现 foldr 函数为:
fun foldr _ c nil = c | foldr f c (a::b) = f(a, foldr f c b);
同样,List.nth.
内部实际发生的事情nth (l, i)
returns 列表 l
的第 i
(th) 个元素,从 0 开始计数。换句话说,它正在访问 [=12= 中的元素] 按索引 i
.
在示例“a”中 List.nth([7,3,6,1], 0)
returns l
中的第 i
(th) 个元素是 7
在示例“b”中 List.nth([7,3,6,1], 1)
returns l
中的第 i
(th) 个元素是 3
List.nth
的简单实现如下所示,使用模式匹配和 option
类型来处理越界错误。
fun nth([], _) = NONE
| nth(x::_, 0) = SOME x
| nth(x::xs, i) = nth(xs, i - 1)
我们在空列表中寻找什么索引并不重要。没有。
如果索引是 0
,return 列表中的第一个元素。列表的其余部分是什么并不重要。
否则,对列表的其余部分调用 nth
并将索引减 1。
所以如果我们调用 nth([3, 7, 4, 1, 8], 3)
递归看起来像:
nth([3, 7, 4, 1, 8], 3)
nth([7, 4, 1, 8], 2)
nth([4, 1, 8], 1)
nth([1, 8], 0)
SOME 1