我对 Cons()
函数在 from 函数定义中的作用感到困惑。
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;
并查看您得到了什么。
这是Stream的两个构造函数之一。请参见屏幕截图的第二行--这就是Cons的全部内容。