Ale*_*lov 2 haskell types typeclass induction
我一直在玩归纳类型(定义的自然数和对它们的算术运算),但我无法让 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
Run Code Online (Sandbox Code Playgroud)
我希望这个表达式是有效的:
naturalNumber = read someStringWithInteger :: Natural,所以我不能只派生 Read 类型类。
我试过使用readsPrecand readPrec,但我只会遇到类型不匹配的错误。
如何实现 Read 类型类的实例?
您的函数类型错误。你readsPrec有类型String -> Natural,而你应该使用Int -> String -> [(Natural, String)]. 但我们可以调整:
readsPrec p s = [(fromInteger i, s') | (i, s') <- readsPrec p s]
Run Code Online (Sandbox Code Playgroud)
这使用Integer的readsPrec功能。既然你想读Integers ,那么为了方便起见,使用它是合适的。
出于对称的原因,我建议您实现showsPrec而不是show在您的Show实例中。