Cons()
在 from 的函数定义中,我对函数的作用感到困惑。
问问题
5068 次
2 回答
10
Stream
代表的是一个惰性且可能无限的列表。由于 SML 是Eager的,所以这需要以稍微迂回的方式来完成。
我们先来看看普通列表是如何工作的:
datatype 'a list = [] | :: of 'a * 'a list
缺点包括两部分:
- 列表中的第一个元素
- 列表的其余部分
在惰性列表中,它非常相似。
datatype 'a Stream = Nil | Cons of 'a * (unit -> 'a Stream)
这里的缺点包括以下内容:
- 列表中的第一个元素
- 评估时产生列表其余部分的函数
()
因此,您可以看到原理大致相同,尽管使用起来有点困难。
让我们看一个示例列表:
fun succ n = Cons (n, fn () => succ (n+1))
val naturals = succ 0
这会产生什么?让我们检查一下。
naturals
被定义为succ 0
,而后者又被定义为Cons(0, fn () => succ 1)
。从这里我们可以看到列表中的第一个元素是0
.
现在让我们更进一步。我们评估fn () => succ 1
,我们的第二部分Cons
,关于()
,它产生succ 1
,它反过来是Cons(1, fn () => succ 2)
。现在我们可以看到列表中的第二个元素是1
.
如果我们重复这个过程,我们会得到列表代表无限列表[0, 1, 2, ...]
。
你也可以通过尝试看到这一点
val firstnats = take 10 naturals;
看看你得到了什么。
于 2012-02-12T11:35:16.247 回答
1
它是 Stream 的两个构造函数之一。请参阅该屏幕截图的第二行 - 这就是 Cons 的全部内容。
于 2012-02-12T05:16:14.340 回答