首页 文章

较高程度的高级类型?

提问于
浏览
2

我刚刚学会了更高级的kinded类型,但我提供的每个例子都只使用了_2种 (* -> *) -> * ,如 Functor .

在Scala中,使用了一个奇怪的 trait 定义,在Haskell中使用了 type classes . 而且这两种方法似乎都无法在一度抽象中起作用(即 ((* -> *) -> *) -> * ) .

我既不是Scala也不是Haskell的专家,所以如果你能提供这种更高学位类型的例子,如果它们完全可以表达的话,那将会很有帮助 .

2 回答

  • 5

    在Scala(Z)中,明显更高级的类型是 MonadTrans 特征:

    trait MonadTrans[F[_ [_], _]] { ... }
    

    它的种类是 T->* ,其中 T 是它的参数 F .

    F 是monad变换器, T 是所有monad变换器 . 回想monad变换器是由monad参数化的,它的"output"是另一个monad,所以它的类型是 (*->*) -> (*->*) (或者,相当于 (*->*) -> * -> * ) . 所以那种 MonadTrans

    ((*->*) -> * -> *) -> *
    

    在Haskell中没有特征,类型类不是类型,因此 MonadTrans 是非类型的 . 有一种类型代表monad变换器的组合:

    newtype ComposeT f g m a = ...
    

    这是 Control.Monad.Trans.Compose 的完整定义:

    newtype ComposeT (f :: (* -> *) -> * -> *) (g :: (* -> *) -> * -> *) m a
        = ComposeT { getComposeT :: f (g m) a }
    

    相当满口! fg 是monad变换器(从明确给出的签名可以看出), m 是monad(签名 * ->* 未明确给出但由 g m 暗示), a 是常规类型 * . 所以 ComposeT 的整体类型是:

    ((* -> *) -> * -> *) ->
    ((* -> *) -> * -> *) ->
     (* -> *) -> * -> *
    
  • 5
    trait Functor[F[_]] //has kind (* -> *) -> *
    
    trait Functor[A[B[_]]] //has kind ((* -> *) -> *) -> *
    
    trait Map[A[_],B[_]] //has kind (* -> *) -> (* -> *) -> *
    

    Edit:

    您可以通过在REPL中调用“kind”命令来自行调查类型:

    scala>:kind -v Map

相关问题