我是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/