4

私はHaskellが初めてで、何が何であるかを知ることができるようにnewtypeを使用できるようにしたいのですが、文字列から読み取る必要もあります。私は持っている

newtype SpecialId Int
    deriving (Eq, Ord, Show)

read "5" :: SpecialIdnewtype で Read を派生させた場合、それが機能しない場合にのみ機能するようにしたいと考えていread "SpecialId 5" :: SpecialIdます。私が試してみました

instance Read SpecialId where
    readsPrec _ s = read s

しかし、これは私に与えます

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

2 に答える 2

6

Intインスタンスに手動で転送する場合は、言語拡張は必要ありません。

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

見た目にもかかわらず、これは の再帰的な使用法ではありません: のバージョンreadsPrecを呼び出してペアのリストを取得し、リスト内包表記を使用してすべてを でラップします。IntreadsPrec(Int, String)IntSpecialId

于 2017-11-02T13:38:59.097 に答える