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

时间:2017-11-02 13:14:00

标签: haskell newtype deriving

我是Haskell的新手,我希望能够使用新类型,因此我可以告诉它是什么,但我也必须从字符串中读取它。我有

newtype SpecialId Int
    deriving (Eq, Ord, Show)

我希望能够read "5" :: SpecialId如果我在新类型中导出读取它不起作用它只适用于read "SpecialId 5" :: SpecialId。我试过了

instance Read SpecialId where
    readsPrec _ s = read s

但是这给了我

SpecialId *** Exception: Prelude.read: no parse

2 个答案:

答案 0 :(得分:9)

这可能是因为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

答案 1 :(得分:6)

如果您愿意手动转发到Int实例,则不需要语言扩展程序:

instance Read SpecialId where
    readsPrec n s = [ (SpecialId x, y) | (x, y) <- readsPrec n s ]

尽管出现这不是递归使用readsPrec:我们调用Int readsPrec(Int, String)来获取Int对的列表,然后我们使用列表理解将每个SpecialId包裹在var id = 2 var value = diskMap[2]