gpt4 book ai didi

haskell - 如何在 haskell 中为数据类型创建 Read 实例

转载 作者:行者123 更新时间:2023-12-02 09:31:14 24 4
gpt4 key购买 nike

所以我有一个数据类型

data SomeType a =
Type a |
Mix (SomeType a) (SomeType a)

这是我的 SomeType 的显示实例

instance (Show a) => Show (SomeType a) where
show (Type a) = show a
show (Mix a b) = "(" ++ show a ++ " " ++ show b ++ ")"

所以

Mix (Type 5) (Type 4)

会给我

(5 4)

现在我想要

read "(3 4)" :: SomeType Int 

生产

(3 4)

read "(a b)" :: SomeType Char

生产

(a b)

我不知道如何使用 Read 类。

最佳答案

这是一个基于 documentation 的示例它应该能够解析 show 呈现的所有内容(假设该类型定义了兼容的 Read 实例),即 read 。 show 或多或少应该是身份:

instance (Read a) => Read (SomeType a) where
readsPrec d r = readMix r ++ readType r
where
readMix = readParen True $ \r -> do
(v1, r'') <- readsPrec d r
(v2, r') <- readsPrec d r''
return (Mix v1 v2, r')

readType r = do
(v, r') <- readsPrec d r
return (Type v, r')

因此,

> read "(3 4)" :: SomeType Int 
(3 4)
it :: SomeType Int

但请注意,对于 SomeType CharChar 的默认 Show 实例用单引号将字符括起来:

> read "('a' ('b' 'c'))" :: SomeType Char
('a' ('b' 'c'))
it :: SomeType Char

希望这有帮助

关于haskell - 如何在 haskell 中为数据类型创建 Read 实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7851275/

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