这个函数中的 Cons 是做什么用的?

8

我对 Cons() 函数在 from 函数定义中的作用感到困惑。

enter image description here

2个回答

10
“Stream”表示的是一个lazy和可能无限的列表。由于SML是eager的,因此需要用稍微绕弯的方式来实现。
首先让我们看一下普通列表的工作原理:
datatype 'a list = [] | :: of 'a * 'a list

cons由两个部分组成:

  • 列表中的第一个元素
  • 列表中剩余的部分

在lazy list中,它非常相似。

datatype 'a Stream = Nil | Cons of 'a * (unit -> 'a Stream) 

这里的cons包括以下内容:

  • 列表中的第一个元素
  • 当在()上被评估时,产生列表其余部分的函数

因此,你可以看到原则基本相同,尽管更难处理。

让我们看一个示例列表:

fun succ n = Cons (n, fn () => succ (n+1))
val naturals = succ 0

这会产生什么?让我们来研究一下。

naturals 被定义为 succ 0,而 succ 0 又被定义为 Cons(0, fn () => succ 1)。从这里我们可以看到列表中的第一个元素是 0

现在让我们再往前走一步。我们对 Cons 的第二部分 fn () => succ 1() 上进行求值,得到 succ 1,它又被定义为 Cons(1, fn () => succ 2)。现在我们可以看到列表中的第二个元素是 1

如果我们重复这个过程,我们就会得到表示无限列表 [0, 1, 2, ...]

您也可以通过尝试执行以下操作来查看:

val firstnats = take 10 naturals;

并查看您得到了什么。


1

这是Stream的两个构造函数之一。请参见屏幕截图的第二行--这就是Cons的全部内容。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接