如何在ghci中调用具有特定数据结构的函数



我有这个函数,它计算添加

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

最新更新