2016-07-26 11 views
0

Ich bin neu in Haskell „konnte nicht erwartet Typ‚f‘mit tatsächlichen Typ übereinstimmen“ und ich versuche zu lernen, wie classe, ich habeeine Instanz für eine typeclass Erstellen wirft:

verwenden, um die Klasse :

class SomeClass f where 
doSome :: Integer -> f 

der Datentyp:

data SomeData = D1 Integer 
       | D2 SomeData SomeData 

und ich versuche, um die Instanz zu erstellen:

instance SomeClass SomeData where 
doSome x = D1 x 

aber die GHCI gibt mir den Fehler:

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

Ich habe einige Fragen in Bezug auf dieses Problem gesehen, aber ich konnte sie nicht für mich arbeiten zu lassen.

Wie kann ich das beheben?

+2

Die Vertiefung falsch ist, und ich bezweifle wirklich Ihre Methode 'do' gestattet. Können Sie Ihren tatsächlichen Code angeben? –

+0

@ Red Barton Tnx! - Du hast Recht, meine Einrückung war falsch (die Namen auch, ich habe meine Frage bearbeitet, um das zu reflektieren, aber das ist nicht der wichtige Teil). nachdem es repariert wurde, kompilierte es und lief wie erwartet (arrr der Fehlercode war überhaupt nicht nützlich) – barakcaf

+0

@ Red Barton das wird mich lehren, nach einer 'where' Klausel einzurücken – barakcaf

Antwort

4

Die Verwendung von D1 nach D2 ist hier nicht gültig:

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

Wo D1 tritt nach D2 Sie eine Art benötigen, aber D1 eine Funktion ist. ändern kompiliert

data SomeData = D1 Integer 
       | D2 SomeData SomeData 

Mit diesem Code:

Sie wahrscheinlich zu schreiben bedeutete. (I ändern auch den Namen do auf einen anderen Namen, die kein Haskell Schlüsselwort ist):

data SomeData = D1 Integer | D2 SomeData SomeData 

class SomeClass f where 
    foo :: Integer -> f 

instance SomeClass SomeData where 
    foo x = D1 x 
+0

das Problem war mit der Einrückung (mein Code war identisch mit dir abgesehen von der Einrückung ...), Tnx für die Hilfe !! – barakcaf