2012-11-28 62 views
0

我在Haskell中的Mod運算符遇到問題它基於我的推理錯誤類型。 Mod在eval的底部。我是Haskell的新手,正在用expr爲課堂製作AST。這是我迄今爲止的代碼。我相信它是一個簡單的修復,但似乎無法得到它。在抽象語法樹中使用Mod Haskell

data Expr = Add Expr Expr 
     | Sub Expr Expr 
     | Mult Expr Expr 
     | EqualTo Expr Expr 
     | GreaterThan Expr Expr 
     | LessThan Expr Expr 
     | Mod Expr 
     | NotEqual Expr Expr 

     | Const Integer 
     | VarName String 
     | TrueE 
     | FalseE 
    deriving (Show,Eq) 


eval :: Expr -> [(String, Integer)] -> Integer 
eval (Add e1 e2) env = eval e1 env + eval e2 env 
eval (Sub e1 e2) env = eval e1 env - eval e2 env 
eval (Mult e1 e2) env = eval e1 env * eval e2 env 
eval (EqualTo e1 e2) env | eval e1 env == eval e2 env = 1 
        | otherwise = 0 
eval (GreaterThan e1 e2) env | eval e1 env > eval e2 env = 1 
      | otherwise = 0  
eval (LessThan e1 e2) env | eval e1 env < eval e2 env = 1 
      | otherwise = 0 
eval (NotEqual e1 e2) env | eval e1 env /= eval e2 env = 1 
         | otherwise = 0 
eval (Mod e1) env = mod eval e1 env 

回答

2

我假設你正在構建AST的評估器,它代表了一個數學表達式。

Haskell功能mod收到兩個參數,但您的AST只收到一個參數,並且您的評估程序中的函數mod接收三個參數。嘗試改變功能eval和數據Expr這樣

data Expr = 
    | Mod Expr Expr 

eval :: Expr -> [(String, Integer)] -> Integer 
eval (Mod e1 e2) env = mod (eval e1 env) (eval e2 env) 

在上面的代碼,功能mod接收兩個參數,分別eval e1 enveval e2 env

0

我用錯了記號對mod應該

eval e1 env `mod` eval e2 env 

愚蠢的錯誤..國防部應該由反勾包圍。

+1

@AndrewC,不需要 – luqui