如何在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