【问题标题】:Working with value constructors in Haskell在 Haskell 中使用值构造函数
【发布时间】:2020-11-04 13:29:01
【问题描述】:

我在这个练习中陷入了困境,程序应该收到如下输入:

dividing (Number 50) (Number 10)

然后输出类似:

Number 10

我试过了:

data Number = Ok Double | Error String deriving Show

dividing :: Number -> Number -> Number
dividing (Number num1) (Number num2) = (Ok (num1/num2))

但我在终端上收到此错误:

35.hs:288:10: error: Not in scope: data constructor ‘Number’
35.hs:288:24: error: Not in scope: data constructor ‘Number’

我得到的最近似的工作代码是下面的代码,但是用户必须输入 Ok 或 Error 才能进行操作,真正的解决方法是什么:

data Number = Ok Double | Error String deriving Show

dividing :: Number -> Number -> Number
dividing (Ok num1) (Ok num2) = (Ok (num1/num2))
dividing (Ok num1) (Error "0") = (Error ("You can't divide by zero"))

我想知道一种直接接收数字而不是接收值构造函数的更好方法。

【问题讨论】:

  • 在匹配 (Ok num2) 之前先匹配 (Ok 0.0)。那应该涵盖特殊情况。不要匹配(Error "0"),而是一般的(Error e) - 想想dividing (Ok 23.0) (dividing (Ok 42.0) (Ok 0.0))) 的情况以及内部应用程序中生成的Error ("You can't divide by zero") 会发生什么。
  • 不,没有更好的方法直接接收数字而不是接收值构造函数。值构造函数数字。
  • 如果 one 参数是错误的,您只需将其作为返回值传播。如果 两个 参数都是错误,则不清楚您是否应该传播一个或另一个错误,或者您是否应该将它们组合成一个 new Error 值。

标签: haskell value-constructor


【解决方案1】:

为什么要打扰OkError?您要创建数字数据构造函数,因此只需将其命名为Number

-- "Number" on the left signifies the number type
-- "Number" on the right signifies the number data constructor
data Number = Number Double deriving (Show)

dividing :: Number -> Number -> Number
-- division by 0 doesn't need to be handled since it's Infinity by the floating point standard
dividing (Number a) (Number b) = Number (a / b)

【讨论】:

  • 谢谢!但是这个练习需要使用 Ok 和 Error,当模式匹配在第二个参数中得到 0 时返回 Error。但我真的坚持这一点......
  • @LuanTorres 如果需要OkError,但测试用例使用(Number 50) 有问题。要么你误读了你的练习,要么是谁写的有误。如果这是作业,请仔细重新阅读。如果您仍然确信您需要OkError 值构造函数,但测试应该使用Number 50,请联系您的教师询问测试用例中是否可能存在拼写错误,他们实际上是指Ok 50
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-01
  • 1970-01-01
  • 2018-02-20
  • 2023-03-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多