2016-11-04 7 views
3

하스켈에서 유형 정보를 가치 수준으로 가져 오는 방법을 찾고 있습니다.하스켈에서 유형 정보를 가치 수준으로 가져 오는 방법은 무엇입니까?

모든 유형 정보를 값으로 표시하는 한 가지 방법은 Language.Haskell.TH.Type입니다. Proxy a을 사용하고 다음과 같이 a 유형의 Language.Haskell.TH.Type (또는 어떤 유형을 나타내는 대체 유형)을 반환하는 함수를 구현할 수있는 방법이 있습니까?

Language.Haskell.TH.Type을 사용하지 않는 값으로 형식 정보를 가져 오는 것이 더 좋은 생각이 있으면 알려주세요.

import Data.Proxy (Proxy) 
import Language.Haskell.TH (Type, TypeQ) 

-- | 
-- >>> amazing (Proxy :: Proxy Bool) 
-- ConT GHC.Types.Bool 
-- 
-- >>> amazing (Proxy :: Proxy [String]) 
-- AppT ListT (ConT GHC.Base.String) 
amazing :: Proxy a -> Type 
amazing p = undefined 

-- | 
-- Or if above is impossible, how about this? 
amazingQ :: Proxy a -> TypeQ 
amazingQ p = undefined 
+0

직접 사용하지는 않았지만 [Data.Data] (https://hackage.haskell.org/package/base-4.7.0.1/docs/Data-Data.html)를 살펴 보았습니까?) 아마 충분한 정보를 제공합니다. – epsilonhalbe

+0

['typeRep'] (http://hackage.haskell.org/package/base-4.9.0.0/docs/Data-Typeable.html#v:typeRep)는 충분히 가깝습니다. – chi

답변

1

나는 당신이 그 유형 정보로 무엇을하고 싶은지를 찾아 내려고합니다. 어느 경우이든, 아마도 당신이보고있을 모듈은 Data.TypeableData.Data입니다. @chi 언급으로이 모듈의 중심 (-XDeriveDataTypeable를 통해 deriveable) 두 typeclasses

class Typeable a where {...} 
class Typeable a => Data a where {..} 

이 있으며,이 중 전자는 당신이 그것에 대해 정보를 찾을 유형을 찌를 수 있습니다. 거기에 당신이 Typeable의 인스턴스가 필요하다는 경고가있다. (정말로 필요하다면 이것들을 고아 인스턴스로 만들 수있다.). 특히, typeRep가 :

ghci> import Data.Typeable 
ghci> typeRep (Proxy :: Proxy (Either (Maybe [Integer]) ((), Bool, Int))) 
Either (Maybe [Integer]) ((), Bool, Int) 

그러나, 당신이 이제까지 당신이 값 표현 (. 즉, 생성자)가이를 조회하려고 형식 정보를 사용하고자 결정하는 경우, 당신은 Data.Data보고 싶을거야 .