SML 中的 List.nth 内部到底发生了什么?

问题描述 投票:0回答:2

有人可以帮我理解 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 函数将是:

有趣的foldr _ c nil = c |折叠 f c (a::b) = f(a, 折叠 f c b);

同样,List.nth 内部实际发生的情况。

functional-programming sml
2个回答
3
投票

List.nth
的简单实现如下所示,使用模式匹配和
option
类型来处理越界错误。

fun nth([], _) = NONE
  | nth(x::_, 0) = SOME x
  | nth(x::xs, i) = nth(xs, i - 1)
  • 我们在空列表中查找什么索引并不重要。不在那里。

  • 如果索引为

    0
    ,则返回列表中的第一个元素。列表的其余部分是什么并不重要。

  • 否则,对列表的其余部分调用

    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

0
投票

nth (l, i)
返回列表
i
的第
l
(第)个元素,从0开始计数。换句话说,它通过索引
l
访问
i
中的元素。

在示例中,“a”

List.nth([7,3,6,1], 0)
返回
i
中的第
l
(第)个元素,即
7

在示例“b”中,

List.nth([7,3,6,1], 1)
返回
i
中的第
l
(第)个元素,即
3

© www.soinside.com 2019 - 2024. All rights reserved.