我怎樣才能自動獲得一個Read
實例,該GADTs:推導閱讀實例爲GADTs
{-# LANGUAGE GADTs, StandaloneDeriving #-}
data TypeDec a where
TypeDecInt :: TypeDec Int
TypeDecString :: TypeDec String
deriving instance Show (TypeDec a)
data Bar where
Bar :: (Show a, Read a) => TypeDec a -> a -> Bar
deriving instance Show Bar
的想法是,Bar
是一個序列化的類型。
我可以通過下面的代碼片段或秒差距寫Read
實例,但考慮到我有許多相似的類型在不同的模塊這種TypeDec
和Bar
是一個樣板:
instance Read Bar where
readsPrec _ s =
let (bar, tup) = second breaks . breaks $ s
in if "Bar" == bar then uncurry parse tup else []
where
parse :: String -> String -> [(Bar, String)]
parse tdec = case tdec of
"TypeDecInt" -> parse' TypeDecInt
"TypeDecString" -> parse' TypeDecString
_ -> const []
parse' :: (Show a, Read a) => TypeDec a -> String -> [(Bar, String)]
parse' tdec s = [(Bar tdec (read s), "")]
breaks :: String -> (String, String)
breaks = second (drop 1) . break (== ' ')
這是完全可以使用模板Haskell。人們只需要使用@dfeuer提到的方法(即使用'case'而不是'GHC.Read.choose')。 – Alec
@Alec你知道用模板Haskell派生'Read'實例的示例/教程嗎? – homam
[This](https://wiki.haskell.org/Template_haskell/Instance_deriving_example)看起來不錯。 – Alec