如何在ghci中调用具有特定数据结构的函数
How to call a function with specific data structure in ghci
我有这个函数可以计算 add
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)
这样调用时,returns 错误:
eval Add (Expr(1), Expr(2))
:30:20: error:
Data constructor not in scope: Expr :: t1 -> b0
您的 Add (Expr(1), Expr(2))
不是 Expr
的表达式。首先,你需要 Num
来构造一个 Expr
,而不是 Expr
,因为那是一个 type 构造函数,而不是 数据构造函数:
Add (<strong>Num</strong> 1) (<strong>Num</strong> 2)
此外,两者之间应该有没有逗号,我们需要括号来传递整个Expr
我们需要括号围绕整个Add …
块, 所以:
eval <strong>(</strong>Add (Num 1) (Num 2)<strong>)</strong>
在您的 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
我有这个函数可以计算 add
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)
这样调用时,returns 错误:
eval Add (Expr(1), Expr(2))
:30:20: error: Data constructor not in scope: Expr :: t1 -> b0
您的 Add (Expr(1), Expr(2))
不是 Expr
的表达式。首先,你需要 Num
来构造一个 Expr
,而不是 Expr
,因为那是一个 type 构造函数,而不是 数据构造函数:
Add (<strong>Num</strong> 1) (<strong>Num</strong> 2)
此外,两者之间应该有没有逗号,我们需要括号来传递整个Expr
我们需要括号围绕整个Add …
块, 所以:
eval <strong>(</strong>Add (Num 1) (Num 2)<strong>)</strong>
在您的 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