我编写了一个独特的数据类型来表达基本数学(加法、乘法等)并且它可以工作 - 但是,当我尝试将其转换为 Maybe 语句时,所有数学都不起作用。我相信这是一个语法错误,但我尝试了额外的括号等等,但我无法弄清楚。通常,Maybe 语句很容易,但我不明白为什么它总是抛出问题。
这是我创建的数据类型(带有示例):
data Math = Val Int
| Add Math Math
| Sub Math Math
| Mult Math Math
| Div Math Math
deriving Show
ex1 :: Math
ex1 = Add1 (Val1 2) (Val1 3)
ex2 :: Math
ex2 = Mult (Val 2) (Val 3)
ex3 :: Math
ex3 = Div (Val 3) (Val 0)
这是代码。唯一的 Nothing 返回应该是除以零。
expression :: Math -> Maybe Int
expression (Val n) = Just n
expression (Add e1 e2) = Just (expression e1) + (expression e2)
expression (Sub e1 e2) = Just (expression e1) - (expression e2)
expression (Mult e1 e2) = Just (expression e1) * (expression e2)
expression (Div e1 e2)
| e2 /= 0 = Just (expression e1) `div` (expression e2)
| otherwise = Nothing
对于每个单独的数学方程,我都会得到相同的错误,即使我删除了其他的,所以我确定它是语法。该错误使它看起来像 Maybe 中的 Maybe 但是当我这样做e1 /= 0 && e2 /= 0 = Just (Just (expression e1)div时(expression e2)),我得到了同样的错误:
* Couldn't match type `Int' with `Maybe Int'
Expected type: Maybe (Maybe Int)
Actual type: Maybe Int
* In the second argument of `div', namely `(expression e2)'
In the expression: Just (expression e1) `div` (expression e2)
In an equation for `expression':
expression (Div e1 e2)
| e1 /= 0 && e2 /= 0 = Just (expression e1) `div` (expression e2)
| otherwise = Nothing
|
56 | | e1 /= 0 && e2 /= 0 = Just (expression e1) `div` (expression e2)
| ^^^^^^^^^
我错过了什么?这让我疯狂。