内置语法的非法绑定:`:`

时间:2013-05-06 17:13:37

标签: haskell stream

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

我找到了列表数据类型 -

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

我写了这个:

data Stream a = a : (Stream a)

但是GHCi给出了错误消息:

  

内置语法的非法绑定::

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

2 个答案:

答案 0 :(得分:11)

构造函数(:)是内置语法,特定于标准列表类型,与标准内容"内置"不同。类型只是标准库中定义的常规类型。

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

data Stream a = a :< Stream a

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

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

data Stream a = Stream a (Stream a)

答案 1 :(得分:6)

注意:您可以使用Data.Stream.Infinite包中的现有streams来实现此目的,并免费获得大量实例和组合器,但(:)本身是以语法构建的。< / p>