2016-12-14 14 views
0

を認識していない私は、このコードだ:Haskellのデータ型が

data Station a b = Machine a b 
      | Line [Station a b] 
     deriving(Show) 

data Machine a b = Req [(a,Int)] b 
    deriving(Show) 


machine :: [(a, Int)] -> b -> Station a b 
machine l b = Req l b 

をし、私がコンパイルしようとすると、それは機械の署名が間違っていると言います。 [(a、Int)] - > b - > Station aの代わりに[(a、Int)] - > b - > Machine a bと表示されます。しかし、私のデータ型では、私はその駅a b =マシンa bと言う。なぜこれはうまくいかないのですか?

答えて

4

Machineという2つのものがあります。一方はStation型を返す型コンストラクタであり、もう一方は型です。たとえ同じ名前を持っていても、2つは無関係です。

'(プライム)をデータコンストラクタに追加することで、2つの用語を明確にすると便利です。そうすることで、我々は唯一の引数としてMachineを保持するためMachine'データコンストラクタを結び付けることができます。

data Station a b = Machine' (Machine a b) 
      | Line [Station a b] 
     deriving(Show) 

そして今、我々は、新たに定義されたコンストラクタを使用するmachine機能を更新することができます。

machine :: [(a, Int)] -> b -> Station a b 
machine l b = Machine' (Req l b) 
+0

をああ、ありがとう!私は間違いなく "マシン"は同じだと思った。 – Midasso

+1

@Midasso今後の参考として、Haskellのための '<! - language-all:lang-hs - > 'です。 – Alec