2016-12-05 3 views
-2

У меня есть эти данные на моем Haskell код:Haskell: переменная ошибка Жесткий тип

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 

это дает мне ошибку на определении Eval, потому что он говорит: не может соответствовать типа «е» с NExpr» 'е' представляет собой жесткий тип переменной связан ... Eval :: ... ожидается еа фактический Nexpr

идент = строки и Nexpr:

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

, как ее решить?

+1

Изменить экземпляр на 'instance (Num a, Ord a) => Evaluable NExpr где ...' – Alec

+0

, тогда он говорит: Ожидая еще одного аргумента Nexpr, первый аргумент Evaluable должен иметь вид *, но имеет вид * -> * @Alec –

ответ

4

Если код кода, который вы дали, действительно является тем, что у вас есть в вашем файле, тогда вы получили неправильный отступ. После фиксации отступы, и после намека на Алека относительно определения экземпляра, этот тип-проверки:

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 

Обратите внимание, что определения после where должны быть отступы.

, как вы написали, вы определяете метод вне любого класса или экземпляра:

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

Но в этом случае eval «s типа определяет, что он должен быть определен для всехe a, не только для NExpr a.

+0

Это была проблема с отступом –

Смежные вопросы