2013-05-06 10 views
9

私はカスタムストリームのデータ型を構築する必要があります。 リストのデータ型と似ていますが、無限リストの場合のみ(空リストなし)。組み込み構文の不正なバインド: `:`

私は、リストデータ型見つかった -

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

を、私はこれを書いた:

data Stream a = a : (Stream a) 

が、GHCiのは、エラーメッセージを表示しますが:

不正の結合ビルトイン構文:

私のデータ型宣言は何が間違っていますか?

+0

'data [] a = a:[a] | [] 'は単にpseduo-syntaxです。実際に有効なHaskellではありません。 – hammar

答えて

11

コンストラクタ(:)は、標準ライブラリで定義されている通常の型である標準の組み込み型とは異なり、組み込みの構文であり、標準のリスト型に固有のものです。

したがって、ストリームの種類に別のコンストラクタを使用する必要があります。

data Stream a = a :< Stream a 

...正常に動作する必要があります:(:|)(:<)は、私が見たバージョンなので、このようなものです。

また、あなたが好む完全あれば中置コンストラクタをドロップすることができます:

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

コンストラクタ(:<)は正常に動作します。ありがとうございました! :) –

6

注:あなたは、この目的のためにstreamsパッケージから既存のData.Stream.Infiniteを使用して自由のためのインスタンスとコンビネータのトンを得ることができますが、 (:)自体が構文で組み込まれています。