10

我需要构建自定义Stream数据类型。它就像列表数据类型,但仅适用于无限列表(没有空列表的可能性)。

我发现列表数据类型 -

data [] a = a : [a] | []

我写了这个:

data Stream a = a : (Stream a)

但 GHCi 给出错误信息:

内置语法的非法绑定: :

我的数据类型声明有什么问题?

4

2 回答 2

11

构造函数(:)是内置语法并且特定于标准列表类型,这与许多标准“内置”类型不同,它们只是标准库中定义的常规类型。

因此,您需要为流类型使用不同的构造函数。(:|)并且(:<)是我见过的版本,所以是这样的:

data Stream a = a :< Stream a

...应该可以正常工作。

如果您愿意,也可以完全删除中缀构造函数:

data Stream a = Stream a (Stream a)
于 2013-05-06T17:21:38.517 回答
6

注意:您可以为此目的使用包中的现有内容,并免费获得大量实例和组合器,但Data.Stream.Infinite它本身是内置语法的。streams(:)

于 2013-05-06T18:56:18.987 回答