2017-05-30 7 views
1

私はHaskellでデータ型を定義しようとしています。このデータ型は ノードと呼ばれます。パラメトリックタイプaまたはNothingを含めることができます。私はそれを定義した:パラメトリックデータ型を構築する

data Node a = Node (Maybe a) deriving (Show) 

を私はGHCに次のようにそれをロードすると、私は例えば ノード(6)

これを入力すると ノードナッシング

は、しかし、私は次のエラーを取得する動作します。

Non type-variable argument in the constraint: Num (Maybe a) 
    (Use FlexibleContexts to permit this) 
    When checking that ‘it’ has the inferred type 
     it :: forall a. Num (Maybe a) => Node a 

なぜですか?私は何を間違えているのですか?

答えて

4

あなたはMaybeを使用してデータ型を定義しているので、あなたがJustで値をラップする必要があります。

Node (Just 6). 

あなただけの空または値を定義しているのいずれかになりますタイプを持っているしたい場合は、それを定義します以下の方法:

data Node b = Empty | Node b deriving (Show) 
+0

ありがとうございました。これはJustと優れた動作をします。私が何かを取るか、またはJust単語を使わずに空であるNodeを構築したいのであれば、それを行う方法はありますか? – eitan

+0

@eitan最新の回答を参照してください。 – syntagma

+0

ありがとうございました。この例では、クリスの説明と一緒に私はそれを得たと思う。乾杯。 – eitan

5

声明data Node a = Node (Maybe a) deriving (Show)は、他の言葉でタイプNode :: Maybe a -> Node aの(関数)のデータコンストラクタを作成し、あなたがトンにタイプMaybe aの値を渡す必要があります彼の機能。

6は、Maybe aではありません。

代わりに、Just 6の値を Node (Just 6)のように渡すことができます。

+0

ありがとうございました。この説明は私にはもっとはっきりと分かります。乾杯。 – eitan

関連する問題