【发布时间】: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值。