Haskell -- 从具体类型实例中获取 TypeRep

标签 haskell types typeclass dynamic-typing

我想用这种类型签名写一个函数:

getTypeRep :: Typeable a => t a -> TypeRep

其中 TypeRep 将是 a 的类型表示,而不是 t a 的类型表示。也就是说,编译器应该在任何调用站点 [to getTypeRep] 自动返回正确的类型表示,这将具有 a.

为了添加一些上下文,我想创建一个“动态类型”数据类型,它会记住顶级类型,但不会记住它的参数。例如,我想将 MyClass a 转换为 Dynamic MyClass,上面的函数将用于创建 Dynamic MyClass 的实例,该实例存储类型参数 a 的表示形式。

最佳答案

那么,如何使用作用域类型变量来选择内部组件:

{-# LANGUAGE ExplicitForAll #-}
{-# LANGUAGE ScopedTypeVariables #-}

import Data.Dynamic
import Data.Typeable

getTypeRep :: forall t a . Typeable a => t a -> TypeRep
getTypeRep _ = typeOf (undefined :: a)

为我工作:
*Main> getTypeRep (Just ())
()
*Main> getTypeRep (Just 7)
Integer
*Main> getTypeRep ([True])
Bool

有趣的设计。

关于Haskell -- 从具体类型实例中获取 TypeRep,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5924539/

相关文章:

python - 如何在Python中将 '+'转换为+

haskell - 防止无意中使用不同类型的类实例

Scala:为反射/运行时实例使用正确的类型类实例

haskell - 在 Haskell 中以通用方式扩充复杂数据类型

types - 为什么类型别名不能使用 Rust 中原始类型的关联常量?

c++ - Binary 处理器如何区分两个相同字节大小的变量类型

haskell - Ord a 允许我使用 "=="吗?

dictionary - Data.Map - 为什么有 `takeWhileAntitone` 但没有 `takeWhile`?

macos - OS X Lion 上的系统出现 GHC 错误

haskell - 如何使用 Haskell 中的 thyme 库从 Int 值创建 UTCTime?