2016-12-05 5 views
-2

ich diese Informationen auf meinem Haskell-Code haben:Haskell: Starre Typ variable Fehler

data Symtable a = General a | Stack a 

class Evaluable e where 
eval :: (Num a, Ord a) => (Ident -> Maybe a) -> (e a) -> (Either String a) 
typeCheck :: (Ident -> String) -> (e a) -> Bool 

instance (Num a, Ord a) => Evaluable (NExpr a) where 
eval _ (Const n) = Right n 
typeCheck f f2 = True --to make the code compilable 

es mir ein Fehler auf der Definition von eval gibt, weil es sagt: konnte nicht Typ ‚e‘ mit NExpr übereinstimmen‘ 'e' ist eine starre Variable vom Typ gebunden ... eval :: ... erwartet ea tatsächlichen Nexpr ein

ident = string und Nexpr:

data NExpr n = Const n | 
      Var Ident | 
      Plus (NExpr n) (NExpr n) | 
      Minus (NExpr n) (NExpr n) | 
      Times (NExpr n) (NExpr n) 

wie es zu lösen?

+1

Ändern Sie die Instanz in 'Instanz (Num a, Ord a) => Auswertbare NExpr wo ...' – Alec

+0

dann heißt es: Erwartet ein Argument mehr zu Nexpr das erste Argument von Evaluable sollte Art * aber hat Art * -> * @Alec –

Antwort

4

Wenn der Code-Block, den Sie gaben, wirklich genau das ist, was Sie in Ihrer Datei haben, dann haben Sie Ihren Einzug falsch erhalten. Nach dem Einzug Festsetzung und nach dem Hinweis von Alec in Bezug auf die Instanzdefinition, ist diese Art Kontrollen:

type Ident = String 

data NExpr n = Const n | 
      Var Ident | 
      Plus (NExpr n) (NExpr n) | 
      Minus (NExpr n) (NExpr n) | 
      Times (NExpr n) (NExpr n) 

data Symtable a = General a | Stack a 

class Evaluable e where 
    eval :: (Num a, Ord a) => (Ident -> Maybe a) -> e a -> Either String a 
    typeCheck :: (Ident -> String) -> e a -> Bool 

instance Evaluable NExpr where 
    eval _ (Const n) = Right n 
    typeCheck f f2 = True --to make the code compilable 

Beachten Sie, dass die Definitionen nach where eingezogen werden müssen.

So wie du es geschrieben hat, eine Methode außerhalb jeder Klasse oder Instanz definieren:

eval :: (Num a, Ord a) => (Ident -> Maybe a) -> e a -> Either String a 
eval _ (Const n) = Right n 

Aber in diesem Fall eval ‚s-Typ gibt an, dass es für allee a definiert werden müssen, nicht nur für NExpr a.

+0

es war ein Problem mit der Einrückung –