2013-05-06 76 views
9

我需要構建自定義數據類型。 這就像列表數據類型,但僅限於無限列表(沒有空列表的可能性)。非法綁定的內置語法:`:`

我發現列表中的數據類型 -

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

,我寫了這個:

data Stream a = a : (Stream a) 

但GHCI給出錯誤信息:

非法的結合內置的語法:

這是什麼問題,我的數據類型聲明?

+0

'data [] a = a:[a] | []'只是pseduo-syntax。這不是真正有效的Haskell。 – hammar 2013-05-06 17:30:32

回答

11

構造函數(:)是標準列表類型的內置語法,與標準庫中定義的標準「內置」類型不同。

因此,您需要爲流類型使用不同的構造函數。 (:|)(:<)是我見過的版本,所以是這樣的:

data Stream a = a :< Stream a 

...應該能正常運行。

你也可能下降綴構造完全如果你喜歡:

data Stream a = Stream a (Stream a) 
+0

構造函數(<)工作正常。謝謝! :) – 2013-05-06 18:39:15

6

注意:您可以使用現有的Data.Stream.Infinitestreams包用於此目的,並得到一噸的實例和組合程序爲免費的,但(:)本身是建立在語法。