我在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
答案 0 :(得分: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 env
和eval e2 env
。
答案 1 :(得分:0)
我使用错误的符号表示mod应该是
eval e1 env `mod` eval e2 env
愚蠢的错误.. mod应该被后面的嘀嗒声包围。