gpt4 book ai didi

haskell - 在 haskell 中实现 Read 类型类的实例

转载 作者:行者123 更新时间:2023-12-02 20:42:15 24 4
gpt4 key购买 nike

我一直在玩归纳类型(定义的自然数和对它们的算术运算),但我无法让 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 类型类。

我试过使用 readsPrecreadPrec,但我只遇到类型不匹配的错误。

如何实现 Read 类型类的实例?

最佳答案

您的函数类型错误。您的 readsPrec 具有类型 String -> Natural,而您应该使用 Int -> String -> [(Natural, String)]。但我们可以调整:

readsPrec p s = [(fromInteger i, s') | (i, s') <- readsPrec p s]

这使用了 IntegerreadsPrec 函数。既然你想读取 Integer,那么为了方便起见就很合适。

出于对称原因,我建议您在 Show 实例中实现showsPrec 而不是 show

关于haskell - 在 haskell 中实现 Read 类型类的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45773151/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com