Cons在这个功能中做了什么?

时间:2012-02-12 05:07:37

标签: sml lazylist

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

enter image description here

2 个答案:

答案 0 :(得分:8)

Stream代表的是lazy且可能无限的列表。由于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;

如果我们重复这个过程,我们会得到列表代表无限列表{{1}}。

你也可以通过尝试

来看到这一点
{{1}}

并看到你得到了什么。

答案 1 :(得分:1)

它是Stream的两个构造函数之一。请参阅该屏幕截图的第二行 - 这就是Cons的所有内容。