【问题标题】:How to call a function with specific data structure in ghci如何在 ghci 中调用具有特定数据结构的函数
【发布时间】:2021-07-07 17:25:48
【问题描述】:

我有这个计算加法的函数

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

【问题讨论】:

  • 如果a &lt; 0eval (Num a) 是否应该返回Nothing?否则(除非您打算稍后添加除法),我看不出有任何理由使用Maybe Double 作为返回类型而不是Double

标签: haskell ghci


【解决方案1】:

您的Add (Expr(1), Expr(2)) 不是Expr 的表达式。首先你需要Num 来构造一个Expr,而不是Expr,因为那是一个type 构造函数,而不是一个data 构造函数

Add (<strong>Num</strong> 1) (<strong>Num</strong> 2)

此外,两者之间应该有 no 逗号,我们需要括号来传递整个 Expr 我们需要括号围绕整个 Add … 块,所以:

eval <strong>(</strong>Add (Num 1) (Num 2)<strong>)</strong>

在您的 eval 函数中,if a &lt; 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

【讨论】:

    猜你喜欢
    • 2023-03-18
    • 1970-01-01
    • 2016-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-08
    • 2012-08-12
    • 1970-01-01
    相关资源
    最近更新 更多