问题描述
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 添加 (Expr(1),Expr(2))
:30:20: 错误: 数据构造函数不在范围内:Expr :: t1 -> b0
解决方法
您的 Add (Expr(1),Expr(2))
不是 Expr
的表达式。首先,您需要 Num
来构造 Expr
,而不是 Expr
,因为它是 type 构造函数,而不是 data 构造函数:
Add (Num 1) (Num 2)
此外,两者之间应该没有逗号,我们需要括号来传递整个 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