2013-06-03 2 views
4

데이터 스트림을 deserialize하려는 중입니다 (개념적으로) ("TypeName", "blah" ("blah"TypeName의 일부 개체에 대해 read에 적절하게 입력 됨)로 구성됩니다.형식을 동적으로 윤곽 지정

read의 결과 유형을 동적으로 선택하는 방법이 있습니까? Data.Dynamic 또는 Data.Typable과 같은 것을 사용합니까?

+3

을 당신이 필요로하는 모든 종류의 레지스트리의 어떤 종류가있는 경우에만. – augustss

+0

레지스트리? 폐쇄 형 세트가 있지만 사용 방법을 잘 모르겠습니다. 흠. 나는'Data.Typable.TypeRep'을위한'Read' 인스턴스를 만들려고합니다. – jpaugh

+2

형식이 닫혀 있으면 형식 이름에 case 문을 사용할 수 있습니다. 각 문은 형식 서명이있는 read 및 toDyn을 사용합니다. – augustss

답변

2

이 올바른 방향을 가리켜 야 :

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) 
+0

감사합니다. Template Haskell을 많이 추가하여이 작업을 복잡하게 만들 겠지만 (거의) 같은 결론을 내 렸습니다. – jpaugh