首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将类型信息纳入Haskell的价值层次?

如何将类型信息纳入Haskell的价值层次?
EN

Stack Overflow用户
提问于 2016-11-04 12:52:33
回答 1查看 461关注 0票数 4

我正在寻找在Haskell中将类型信息引入价值级别的方法。

我知道将任何类型信息表示为值的一种方法是Language.Haskell.TH.Type。是否有任何方法实现接受Proxy a并返回a类型的Language.Haskell.TH.Type (或表示任何类型的替代类型)的函数,如下所示?

如果您有更好的主意将类型信息作为不使用Language.Haskell.TH.Type的值,也请告诉我。

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-11-04 16:21:13

我归结起来就是找出你想用那个类型的信息做什么。在这两种情况下,您可能会看到的模块是Data.TypeableData.Data。这些模块的核心是两个类型类(可通过-XDeriveDataTypeable派生)。

代码语言:javascript
复制
class Typeable a where {...}
class Typeable a => Data a where {..}

正如@chi所提到的,前者允许您戳一个类型来查找有关它的信息。尽管如此,还有一个警告,您需要Typeable实例才能工作(尽管如果您真的需要.,可以开始创建这些实例的孤立实例)。特别是有typeRep

代码语言:javascript
复制
ghci> import Data.Typeable
ghci> typeRep (Proxy :: Proxy (Either (Maybe [Integer]) ((), Bool, Int)))
Either (Maybe [Integer]) ((), Bool, Int)

但是,如果您决定要使用类型信息来查找值表示(即。(构造函数)它已经完成了,您将需要查看Data.Data

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40423176

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档