我们不能对每种类型都执行read someValue::someDataType
或show someValue
,因为必须派生(Show, Read)
写在 data
声明中。除了错误之外,是否存在我们不希望我们的类型可序列化的情况?
为什么 Show 和 Read 分开?有没有一种情况,除了错误之外,我们只想显示一些数据而不读取它?如果不是,为什么不使用单一数据类型Serialized
?
刚才,我正在使用the Key
datatype of the Gloss library它派生出 Show
而不是 Read
,我不明白。很遗憾,因为我想将控件的配置放在一个文件中,然后读取它,这样玩家就可以更改控件并拥有自己的配置。
我必须为 Key、SpecialKey 和 MouseButton 做包装,这没什么大不了的,但没什么用。
data Key' = Char' Char | SpecialKey' SpecialKey | MouseButton' MouseButton
deriving (Eq, Ord, Show, Read)
convertKey x = case x of
Char' c -> Char c
SpecialKey' sk -> SpecialKey sk
MouseButton' mb -> MouseButton mb
最佳答案
首先,并不是所有的数据类型都能显示,比如函数无法显示,所以并不是所有的数据类型都能显示(也不能读取)。最初的 Haskell 定义指定,如果没有给出派生子句,则将派生尽可能多的派生类。这使得很难知道实际派生了哪些类,因此更改了 Haskell 定义以强制显式派生子句。
其次,在原始 Haskell 定义中,show
和 read
函数在 Text
类中捆绑在一起。当您派生 Show
和 Read
时,这并不是什么大问题,但当您手动编写它们时,这就很痛苦了。您经常想要定义一个特殊的 show
函数,但现在您还被迫编写一个 read
函数,因此最好将它们分开。就我个人而言,我几乎总是导出 Show
,但几乎从不 Read
。
Show
和 Read
类并不是真正用于序列化,而是用于简单的输入和输出。
关于haskell - 为什么在 Haskell 中显式推导 Show/Read?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11333060/