我正在寻找在Haskell中将类型信息纳入价值水平的方法。
我知道将任何类型信息表示为值的一种方法是Language.Haskell.TH.Type
。
是否有任何方法可以实现一个函数,该函数采用Proxy a
并返回Language.Haskell.TH.Type
类型的a
(或替代类型来表示任何类型),如下所示?
如果您最好将类型信息作为不使用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 :(得分:1)
我归结为找到你想要对该类型信息做什么。在任何一种情况下,您可能会看到的模块是Data.Typeable
和Data.Data
。这些模块的中心是两个类型类(可以通过-XDeriveDataTypeable
推导出来)
class Typeable a where {...}
class Typeable a => Data a where {..}
正如@chi提到的那样,前者可以让你找一个类型来找出它的相关信息。这就是说,你需要Typeable
的实例来实现这一点(尽管如果你真的需要......你可以开始制作这些实例的孤立实例)。特别是typeRep
:
ghci> import Data.Typeable
ghci> typeRep (Proxy :: Proxy (Either (Maybe [Integer]) ((), Bool, Int)))
Either (Maybe [Integer]) ((), Bool, Int)
但是,如果您决定使用类型信息来尝试查找它所具有的值表示(即构造函数),那么您将要查看Data.Data
。