我有这个函数,它计算添加
data Expr
= Num Double
| Add Expr Expr
| Sub Expr Expr
deriving (Show)
eval :: Expr -> Maybe Double
eval (Num a) = if a < 0 then
eval (Add a b) = case eval a
Nothing -> Nothing
Just a1 -> case eval b of
Nothing -> Nothing
Just b1 -> Just (a1 + b1)
当这样调用它时,它返回错误:
eval-Add(Expr(1(,Expr(2((
:30:20:错误:数据构造函数不在作用域中:Expr::t1->b0
您的Add (Expr(1), Expr(2))
不是Expr
的表达式。首先,您需要Num
来构造Expr
,而不是Expr
,因为它是类型的构造函数,而不是数据构造函数:
Add (Num1) (Num2)
此外,两者之间应该有没有逗号,我们需要括号来传递整个Expr
,我们需要在整个Add …
块周围加括号,所以:
eval(Add (Num 1) (Num 2))
在您的eval
函数中,if a < 0 then …
之后似乎缺少某些内容
您也可以将eval (Add a b)
实现为:
eval :: Expr -> Maybe Double
eval (Num a) = if a < 0 then … else …
eval (Add a b) = (+) <$> eval a <*> eval b