2016-12-05 4 views
-1

У меня есть эти данные на моем 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 f f2 = Left ("Undefined variable: ") --to make the code compilable 
typeCheck f f2 = True --to make the code compilable 

Дело в том, Eval функция возвращает оценку числового выражения (например, 3 + 5, или х + 3), поэтому Я должен проверить значение X в данных symtable, но я не получил ссылку на эту функцию (я не могу редактировать заголовок функции). Как мне это сделать?

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

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

Предположительно, первый аргумент 'eval' это функция, которая делает поиск имен для всех имен, найденных во втором аргументе? – chepner

+0

возможно, но я немного потерялся с haskell, я не знаю, что с ним делать или как передать его или как его оценить с помощью, может быть, –

+0

Это зависит от того, что такое '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' как. – chepner

ответ

2

Первый arugment к eval это функция, которая будет искать значение имени найденного в выражении. Вы игнорируете его при оценке значения Const, используйте его при оценке значения Var и просто передавайте его вместе с рекурсивными вызовами для других случаев.

instance (Num a, Ord a) => Evaluable (NExpr a) where 
    eval _ (Const n) = Right n 
    eval lookup (Var x) = case lookup x of 
          Nothing -> Left ("Undefined variable: " ++ x) 
          Just y -> Right y 

    eval lookup (Plus left right) = (+) <$> eval lookup left <*> eval lookup right 
    -- etc 
+1

Это также требует некоторых изменений в 'class Evaluable', в противном случае это связано с« NExpr a b », которое является доброй ошибкой. – chi

+0

спасибо, кстати, что означает: <$> и <*> –

+0

он говорит: не может соответствовать типу 'e' с NExpr '' e '- это переменная жесткого типа, связанная ... eval :: ... expected ea фактический Nexpr a –

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