0
我有一个数据类型:乘法AbstractInteger
data AbstractInteger = Zero
| Succ AbstractInteger
| Pred AbstractInteger
deriving (Show, Eq)
我已经有两个功能:
1)转换AbstractInteger成整数:
aiToInteger :: AbstractInteger -> Integer
aiToInteger (Zero) = 0
aiToInteger (Succ next) = 1 + (aiToInteger next)
aiToInteger (Pred prev) = (aiToInteger prev) - 1
2)加法AbstractInteger:
plusAbs :: AbstractInteger -> AbstractInteger -> AbstractInteger
plusAbs a b | aiToInteger a == 0 = b
| aiToInteger b == 0 = a
| aiToInteger a > 0 = (Succ (plusAbs (Pred a) b))
| otherwise = (Pred (plusAbs (Succ a) b))
但我不明白如何创建乘法函数。
我写了这个,但它不工作。
multiplyAbs :: AbstractInteger -> AbstractInteger -> AbstractInteger
multiplyAbs _ (Zero) = (Zero)
multiplyAbs (Zero) _ = (Zero)
multiplyAbs a (Succ Zero) = a
multiplyAbs (Succ Zero) b = b
multiplyAbs a b = (plusAbs a (timesAbs a (Pred(b))))
你可以利用'plusAbs',实现乘法作为重复加法。你不能在你自己的自定义整数上使用'+'。 – chi
@chi是啊这是错误的,我已经修复它,但它仍然不起作用 – Max
我会鼓励你实现'plusAbs'而不使用'aiToInteger'来更好地感觉你的数据类型是如何工作的。 – chepner