Типовые ошибки в простом Haskell AST - PullRequest
1 голос
/ 03 ноября 2011

(Пожалуйста, простите меня за любые ошибки форматирования, поскольку я впервые задаю здесь вопрос.)

Я работаю над переводчиком для языка While для класса, иЯ думаю, что у меня есть довольно хорошее понимание идей и того, что мне нужно сделать.Для нас был предоставлен некоторый код (функции eval для типа Expr), и мы должны реализовать eval для типа Statement и функцию поиска символов для назначений.

Моя текущая проблема заключается в том, что я получаю типошибки при попытке сделать выше, и я не уверен, почему.

Вот соответствующий код (обратите внимание, что в то время как eval намеренно установлен = 0 намеренно в данный момент):

data Expr = Num Integer
      | Var String
      | Bin Op Expr Expr deriving Show

data Statement = Assign String Expr
                | If Expr Statement Statement
                | While Expr Statement
                | Compound [Statement] deriving Show

env = [("n",1), ("fact", 1)]

eval (Num x) _ = x
eval (Var v) e = xlookup v e
   where xlookup v ((w, x):r) | v==w = x
                              | otherwise = xlookup v r
eval (Bin op l r) e = kop op (eval l e) (eval r e)
  where kop Mul x y = x * y
        kop Sub x y = x - y
        kop Add x y = x + y
        kop Gt  x y | x > y = 1
                    | otherwise = 0

eval (While exp s) e = 0

factorial = (Compound [
               (Assign "n" (Num 7)),
               (Assign "fact" (Num 1)),
               (While (Bin Gt (Var "n") (Num 1))
                  (Compound [
                      (Assign "fact" (Bin Mul (Var "fact") (Var "n"))),
                      (Assign "n" (Bin Sub (Var "n") (Num 1)))
                  ])
               )
            ])

Вот что я получаю:

Hugs> :l while.hs
ERROR "while.hs":37 - Type error in function binding
*** Term           : eval
*** Type           : Statement -> [([Char],Integer)] -> Integer
*** Does not match : Expr -> [([Char],Integer)] -> Integer

По сути, при каждой попытке сделать eval-функцию для Statement Haskell, похоже, вместо этого ожидает Expr, и я не уверен, почему.Я уверен, что это очень простой вопрос, но, к сожалению, я очень новичок в Haskell и, видимо, все еще довольно ужасен в этом.Спасибо за любую помощь.

Ответы [ 2 ]

5 голосов
/ 03 ноября 2011

Вам нужно либо сделать eval метод класса типов, который, на мой взгляд, излишним на данный момент, либо создать отдельные функции eval для типов Expr и Statement:

eval_expr (Num x) = ...
eval_expr (Var x) = ...
eval_expr (Bin op l r) = ...

eval_stmt (While expr x) = ...

Метод класса типовбудет выглядеть так:

class Eval a where
    eval :: a -> [([Char], Integer)] -> Integer

instance Eval Expr where
    eval (Num x) = ...
    ...

instance Eval Statement where
    eval (While expr x) = ...
3 голосов
/ 03 ноября 2011

Первые три уравнения для eval принимают Expr и окружение, но While является конструктором типа Statement.Таким образом, определения, которые вы даете, являются несовместимыми.Вам, вероятно, понадобятся две функции оценки, одна для выражений и одна для операторов.Если вы дадите свои определения типов подписей, вы получите более точные (как в: легче для понимания) сообщения об ошибках в целом.

...