2016-07-26 4 views
0

私はHaskellのに新しいですし、私はクラッセの使用方法を学習しようとしているはスロー:私はクラスを持って、

を「実際の型と予想される型 『F』と一致しませんでした」 :

class SomeClass f where 
doSome :: Integer -> f 

データタイプ:

data SomeData = D1 Integer 
       | D2 SomeData SomeData 

と私はインスタンスを作成しようとしています:

instance SomeClass SomeData where 
doSome x = D1 x 

GHCiのは私にエラーを与えるが、:

Couldn't match expected type ‘f’ with actual type ‘SomeClass’

私は、この問題に関するいくつかの質問を見てきましたが、私は彼らが私のために動作させることができませんでした。

どうすればこの問題を解決できますか?

+2

インデントは間違っている、と私は本当にあなたのメソッドは 'do'名付けられ疑います。実際のコードを提供できますか? –

+0

@ Red Barton Tnx! - あなたは正しい、私のインデントは間違っていた(名前も、私はそれを反映するために私の質問を編集したが、それは重要な部分ではない)。それを修正した後、それはコンパイルされ、期待通りに実行されます(エラーコードは役に立たなかった) – barakcaf

+0

@ Red Bartonこれは 'where'節の後に字下げを教えてくれるだろう。 – barakcaf

答えて

4

D2D1の使用は、ここで有効ではありません:D1はあなたのタイプを必要とするD2後に発生しますが、D1機能です

data SomeData = D1 Integer 
       | D2 D1 D1 
        ^^^^^ 

おそらく、書くためのもの:この変更に伴い

data SomeData = D1 Integer 
       | D2 SomeData SomeData 

あなたのコードがコンパイルされます。 (私もHaskellのキーワードではありません別の名前に名前doを変更):

data SomeData = D1 Integer | D2 SomeData SomeData 

class SomeClass f where 
    foo :: Integer -> f 

instance SomeClass SomeData where 
    foo x = D1 x 
+0

問題は字下げで問題になっていました(私のコードは字下げを除いてあなたのものと同じでした...)、助けのためのtnx! – barakcaf