我正在寻找在Haskell中将类型信息引入价值级别的方法。
我知道将任何类型信息表示为值的一种方法是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发布于 2016-11-04 16:21:13
我归结起来就是找出你想用那个类型的信息做什么。在这两种情况下,您可能会看到的模块是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。
https://stackoverflow.com/questions/40423176
复制相似问题