【发布时间】:2017-08-19 15:14:04
【问题描述】:
我一直在玩一些归纳类型(定义的自然数和对它们的算术运算),但我无法让 Haskell 读取函数工作。
这是我的代码:
data Natural = Zero | Succ Natural
deriving (Eq, Ord)
instance Enum Natural where
pred Zero = undefined
pred (Succ x) = x
succ x = Succ x
toEnum 0 = Zero
toEnum x = Succ (toEnum (x - 1))
fromEnum Zero = 0
fromEnum (Succ x) = fromEnum x + 1
instance Num Natural where
(+) x Zero = x
(+) x (Succ y) = Succ (x + y)
(-) Zero (Succ x) = undefined
(-) x Zero = x
(-) (Succ x) (Succ y) = x - y
(*) x Zero = Zero
(*) x (Succ y) = x * y + x
abs x = x
signum Zero = Zero
signum (Succ x) = Succ Zero
fromInteger 0 = Zero
fromInteger x = Succ (fromInteger (x - 1))
instance Show Natural where
show x = show $ fromEnum x
-- Not working!
instance Read Natural where
readsPrec x = fromInteger $ (read x) :: Integer
我希望这个表达式有效:
naturalNumber = read someStringWithInteger :: Natural,所以我不能只派生 Read 类型类。
我尝试过使用readsPrec 和readPrec,但我只收到不匹配的类型错误。
如何实现 Read 类型类的实例?
【问题讨论】:
-
“我试过使用 readsPrec 和 readPrec,但我只得到不匹配的类型错误。” - 这是正确的方法。您应该包括您的类型错误。
readPrec = fmap fromInteger . readPrec应该可以工作。 (除此之外:show $ fromEnum x会为不适合Int的自然生成错误。你应该实现Integral Natural然后编写show $ toInteger x)
标签: haskell types typeclass induction