use*_*167 7 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
Run Code Online (Sandbox Code Playgroud)
归根结底就是找到你想用该类型信息做什么。无论哪种情况,您可能要查看的模块都是Data.Typeable和Data.Data。这些模块的中心是两个类型类(可通过 派生-XDeriveDataTypeable)
class Typeable a where {...}
class Typeable a => Data a where {..}
Run Code Online (Sandbox Code Playgroud)
正如 @chi 提到的,前者可以让你戳一个类型来查找有关它的信息。也就是说,需要注意的是,您需要实例才能Typeable使其工作(尽管如果您确实需要,您可以开始创建这些实例......)。特别是,有typeRep:
ghci> import Data.Typeable
ghci> typeRep (Proxy :: Proxy (Either (Maybe [Integer]) ((), Bool, Int)))
Either (Maybe [Integer]) ((), Bool, Int)
Run Code Online (Sandbox Code Playgroud)
但是,如果您决定要使用类型信息来尝试查找它所具有的值表示(即构造函数),您将需要查看Data.Data.