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 

例如:

  1. 使用递归实现 map 函数为:

趣味地图_nil = nil |地图 f (a::b) = (f a) :: (地图 f b);

  1. 使用递归实现 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