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的表示.
那么,如何使用范围类型变量来选择内部组件:
{-# 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)
有趣的设计.
在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)