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

gat*_*ado 11 haskell types typeclass dynamic-typing

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

getTypeRep :: Typeable a => t a -> TypeRep
Run Code Online (Sandbox Code Playgroud)

其中TypeRep将是类型表示为一个,而不是为TA.也就是说,编译器应该随时调用位置[自动返回正确的类型表示getTypeRep ],这将有具体的类型一个.

要添加一些上下文,我想创建一个"动态类型"数据类型,其扭曲是它将记住顶级类型,但不记住它的参数.例如,我想将MyClass a转换为Dynamic MyClass,上面的函数将用于创建Dynamic MyClass的实例,用于存储类型参数a的表示.

Don*_*art 9

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

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

import Data.Dynamic
import Data.Typeable

getTypeRep :: forall t a . Typeable a => t a -> TypeRep
getTypeRep _ = typeOf (undefined :: a)
Run Code Online (Sandbox Code Playgroud)

适合我:

*Main> getTypeRep (Just ())
()
*Main> getTypeRep (Just 7)
Integer
*Main> getTypeRep ([True])
Bool
Run Code Online (Sandbox Code Playgroud)

有趣的设计.


Tho*_*son 8

在Don的解决方案的注意事项上,请注意代码很少需要 ScopedTypeVariables.它只是使解决方案更清洁(但不太便携).没有作用域类型的解决方案是:

{-# LANGUAGE ExplicitForAll #-}
import Data.Typeable

helper :: t a -> a
helper _ = undefined

getTypeRep :: forall t a. Typeable a => t a -> TypeRep
getTypeRep = typeOf . helper
Run Code Online (Sandbox Code Playgroud)