Это должно направить вас в правильном направлении:
import Data.Typeable
import Data.Dynamic
import Control.Applicative
readMay :: Read a => String -> Maybe a
readMay s = case reads s of
(a,[]):_ -> Just a
_ -> Nothing
reconstruct :: Typeable a => (Maybe a -> r) -> (String, String) -> r
reconstruct k (typ,val) =
case typ of
"string" -> k $ cast =<< (readMay val :: Maybe String)
"int" -> k $ cast =<< (readMay val :: Maybe Int)
"double" -> k $ cast =<< (readMay val :: Maybe Double)
reconstructToDyn (typ,val) =
case typ of
"string" -> toDyn <$> (readMay val :: Maybe String)
"int" -> toDyn <$> (readMay val :: Maybe Int)
"double" -> toDyn <$> (readMay val :: Maybe Double)
Только если у вас есть какие-то реестр для всех типов вам нужно. – augustss
Реестр? У меня есть закрытый набор типов, но я не уверен, как это использовать. Хм. Я занимаюсь созданием экземпляра 'Read' для' Data.Typable.TypeRep'. – jpaugh
С закрытым набором типов вы можете использовать оператор case для имени типа, каждый рычаг с использованием read и toDyn с сигнатурой типа. – augustss