如何在Haskell中将类型信息带入价值水平?

时间:2016-11-04 12:52:33

标签: haskell template-haskell type-level-computation

我正在寻找在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

1 个答案:

答案 0 :(得分:1)

我归结为找到你想要对该类型信息做什么。在任何一种情况下,您可能会看到的模块是Data.TypeableData.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