2017-04-20 9 views
0

私は作成したタイプの型クラスインスタンスを作成しようとしていますが、問題が発生しています。typeclassインスタンス宣言で定義とパターンマッチングが矛盾しています

data PlusMinus a = Plus a | Minus a | Zero 
deriving(Eq,Show) 

Essentialy我々は、3種類のデータコンストラクタを持っており、Numのインスタンスは、これらの異なるコンストラクタに基づいて異なる動作をする必要があるタイプを持っています。それをここまで

ので
instance (Ord a, Eq a,Num a) => Num (PlusMinus a) where 
    Plus a + Plus b = Plus (a + b) 
    Plus a - Plus b 
     | a > b = Plus (a - b) 
     | a == b = Zero 
     | a < b = Minus (b - a) 
    Plus a * Plus b = Plus (a * b) 
    abs (Plus a) = Plus (a) 
    signum (Plus a) = 1 
    fromInteger a 
     | a > 0 = Plus (fromInteger a) 
     | a == 0 = Zero 
     | a < 0 = Minus (fromInteger . abs $ a) 

は、正常に動作し、そして期待のように振る舞うが、私は

Minus a + Minus b = Minus (a + b) 

を追加したときに突然、私は私が+のための矛盾の定義を持って聞いています。 なぜこれは関数定義のパターンマッチングのように機能しませんか? 同じ方法で動作しますか、私はちょうど何か間違っていますか?

+1

エラー、そのようなインデントが正確ですか?つまり、すべてのパターンは互いに隣り合っていなければなりません。すべての 'k + v'、次にすべて' k-v'などとなります。 – Zeta

+0

私は質問の字下げを修正する必要がありました。実際のコードは字下げされていました。私は線の順序を変更しようとします。ありがとう! –

+0

ありがとう!それをしたのはラインオーダーでした。 'マイナスa +マイナスb ... 'を'プラスa +プラスb ...'の直下まで動かすと –

答えて

2

あなたが機能fを定義すると、関数のすべてのパターンが互いに隣接している必要があります。

f 1 'a' = 0 
f 1 'b' = 1 
f k v = 2 

あなたは、間に別の機能のパターンを追加する場合は、複数の宣言があります

f 1 'a' = 0 
f 1 'b' = 1 

whoops k = "hello" 

f k v = 2 -- error here 

+のパターンをすべて隣に置いてください。

関連する問題