如何在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)
像这样调用它时,它返回错误:
评估添加(Expr(1),Expr(2))
:30:20: 错误:数据构造函数不在范围内:Expr :: t1 -> b0
回答
您Add (Expr(1), Expr(2))的不是Expr. 首先,您需要Num构造 an Expr,而不是 anExpr因为它是类型构造函数,而不是数据构造函数:
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