如何在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 添加 (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