我想用这种类型签名写一个函数:
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/