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

Сер*_*кий 10 haskell stream

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

我找到了列表数据类型 -

data [] a = a : [a] | []
Run Code Online (Sandbox Code Playgroud)

我写了这个:

data Stream a = a : (Stream a)
Run Code Online (Sandbox Code Playgroud)

但GHCi给出错误信息:

内置语法的非法绑定::

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

C. *_*ann 11

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

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

data Stream a = a :< Stream a
Run Code Online (Sandbox Code Playgroud)

......应该工作正常.

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

data Stream a = Stream a (Stream a)
Run Code Online (Sandbox Code Playgroud)


Edw*_*ETT 6

注意:您可以使用现有的Data.Stream.Infinitestreams包用于此目的,并得到一吨的实例和组合子免费,但(:)本身是建立在语法.