haskell - 为什么在 Haskell 中显式推导 Show/Read?

标签 haskell derived-types

我们不能对每种类型都执行read someValue::someDataTypeshow 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 定义中,showread 函数在 Text 类中捆绑在一起。当您派生 ShowRead 时,这并不是什么大问题,但当您手动编写它们时,这就很痛苦了。您经常想要定义一个特殊的 show 函数,但现在您还被迫编写一个 read 函数,因此最好将它们分开。就我个人而言,我几乎总是导出 Show,但几乎从不 Read

ShowRead 类并不是真正用于序列化,而是用于简单的输入和输出。

关于haskell - 为什么在 Haskell 中显式推导 Show/Read?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11333060/

相关文章:

haskell - "cabal new-install Cabal cabal-install"在 Windows10 上回答 "cabal.exe: Could not read index. Did you call ' checkForUpdates '?"

haskell - 可变参数组合函数?

javascript - 从类创建派生类型,但省略构造函数( typescript )

c# - 返回派生函数中的派生类型

algorithm - 寻找唯一的(只出现一次)元素haskell

haskell - 为什么 (.) map 有这种类型?

haskell - 如何使用 Haskell 类型来重载方法

io - 如何使用名称列表在派生类型中编写可分配数组?

multidimensional-array - 在Fortran 90中使用2d数组与派生类型的数组

c - Fortran 派生类型包含可从 C 访问的指针