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接收两个参数,但您的 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)

In the above code, function mod receives two arguments, eval e1 env and eval e2 env respectively.

于 2012-11-28T06:20:03.387 回答
0

我对 mod 使用了错误的符号,它应该是

eval e1 env `mod` eval e2 env 

愚蠢的错误.. mod 应该被反引号包围。

于 2012-11-28T06:17:35.850 回答