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

10-13 04:10