在 Haskell 中使用值构造函数
Working with value constructors in Haskell
我完全坚持这个练习,程序应该收到如下输入:
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
和 Error
?您想创建数字数据构造函数,因此只需将其命名为 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)
我完全坚持这个练习,程序应该收到如下输入:
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
和 Error
?您想创建数字数据构造函数,因此只需将其命名为 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)