gpt4 book ai didi

haskell - 如何在 Haskell 中编写自定义显示功能

转载 作者:行者123 更新时间:2023-12-02 02:51:08 25 4
gpt4 key购买 nike

我正在定义一个 Octave 类型:

data Octave = 1 | 2 | 3
deriving (Show, Read, Ord, Enum)

由于“1”对数据构造函数标识符无效,因此我必须这样做:
data Octave = O1 | O2 | O3
deriving (Show, Eq, Read, Ord, Enum)

现在,如果我 show Octave O1它显示“O1”,这不是我想要的。我希望结果为“1”。我知道我们可以像这样自定义我们的 Show 行为:
instance Show Blabla where                                                                                       
show (Blabla ints chars list num) =
"integers = " ++ show ints ++ "\n"

但问题是我使用的是枚举类型,这意味着它除了标识符名称“O1”之外没有其他值。如何在 Haskell 中访问它?

另一个问题:我怎样才能读回它?
read "O1" :: Octave有效,但我想要 read "1" :: Octave
instance Read Octave where
read "1" = O1
read "2" = O2
read "3" = O3

这不起作用:“ read 不是类 Read 的(可见)方法”。

最佳答案

利用 Octave 的 Enum实例并使用 ShowRead Int 的实例我们可以像这样实现显示和阅读:

data Octave = O1 | O2 | O3 deriving (Eq, Ord, Enum)

instance Show Octave where
show o = show (fromEnum o + 1)

instance Read Octave where
readsPrec prec = map (\(n,s) -> (toEnum (n - 1), s)) . readsPrec prec

IE。 fromEnumtoEnum在 Octave 和整数之间转换,以便 O1 <-> 0O2 <-> 1 ,所以我们在阅读和写作上都要调整一。

关于haskell - 如何在 Haskell 中编写自定义显示功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18606827/

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