0

私が持っているものに基づいて間違った型を推測する Haskell の Mod 演算子に問題があります。Mod は eval の一番下にあります。私は Haskell を初めて使用し、クラスの expr を使用して AST を作成しています。ここに私がこれまでに持っているコードがあります。簡単な修正だと確信していますが、うまくいかないようです。

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  
4

2 に答える 2

2

数式を表す AST のエバリュエーターを作成しているとします。

Haskell 関数modは 2 つの引数を受け取りますが、AST は引数を 1 つしか受け取りませんmod。エバリュエーターの関数は 3 つの引数を受け取ります。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は 2 つの引数eval e1 enveval e2 envそれぞれ受け取ります。

于 2012-11-28T06:20:03.387 に答える
0

mod の間違った表記法を使用していました。

eval e1 env `mod` eval e2 env 

愚かな間違い.. mod はバック ティックで囲まれている必要があります。

于 2012-11-28T06:17:35.850 に答える