我是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
答案 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]
。