Haskell实例读取的只是一个int的newtype

标签 haskell newtype deriving

我是Haskell的新手,我希望能够成为一个新类型,以便我能分辨出什么,但是我还必须从字符串中读取它。我有

newtype SpecialId Int
    deriving (Eq, Ord, Show)

如果希望以newtype派生Read,则我希望能够使用read "5" :: SpecialId,但它仅适用于read "SpecialId 5" :: SpecialId,因此不起作用。我试过了
instance Read SpecialId where
    readsPrec _ s = read s

但这给了我
SpecialId *** Exception: Prelude.read: no parse

最佳答案

自GHC 8.2使用 -XDerivingStrategies 以来,这是可能的:

{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE DerivingStrategies         #-}

newtype SpecialId = SpecialId Int
    deriving stock   (Eq, Ord, Show)
    deriving newtype Read

在ghci中:
ghci> read "5" :: SpecialId 
SpecialId 5

关于Haskell实例读取的只是一个int的newtype,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47076275/

相关文章:

haskell - Agda:我的代码没有类型检查(如何正确获取隐式参数?)

Haskell,我如何构造一个新的数据类型,使该类型的值为 1 或 2 或 3?

pattern-matching - 如何巧妙地解构嵌套在记录中的新类型?

haskell - PersistFieldSql 的 GeneralizedNewtypeDeriving 失败

haskell - 防止输入字符出现在终端中

ubuntu - 让 Haskell 的 hsenv 在 Ubuntu 13 上运行

rust - 在柴油塔中使用新类型

haskell - 量化约束与(封闭)类型族

haskell - 组合两个单子(monad)变压器堆栈时无法派生 Applicative

haskell - 派生出具有更多类型变量的新类型