更高程度的高级类型?

dom*_*min 2 haskell scala traits typeclass higher-kinded-types

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

在Scala中,使用了奇怪的特征定义,在Haskell中,使用了类型类.并且这两种方法似乎都不能更多地使用一种抽象(即((* -> *) -> *) -> *).

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

Bog*_*nko 5

trait Functor[F[_]] //has kind (* -> *) -> *

trait Functor[A[B[_]]] //has kind ((* -> *) -> *) -> *

trait Map[A[_],B[_]] //has kind (* -> *) -> (* -> *) -> *
Run Code Online (Sandbox Code Playgroud)

编辑:

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

scala>:kind -v Map

  • 为了澄清,因为我认为没有人在上面的注释中真正回答过它,在第二个例子中,`A`是一个在`Functor`定义中可见的类型构造函数.`B`只是给出该参数的名称,但仅在"A"的声明范围内.`trait Functor [A [B [_]]] {def b:B [Int]}`无效,但`Functor [A [B [_]] <:B [Int]]`不是.您可以将'B`替换为`_`,如'Functor [A [_ [_]]]`,但不能替换为`Functor [A [_ [_]] <:_ [Int]]`,因为删除`A`的参数和边界之间的关系.打个比方:`trait T [F [X] <:Seq [X]]`/`trait T [F [_]]`. (2认同)

n. *_* m. 5

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

trait MonadTrans[F[_ [_], _]] { ... }
Run Code Online (Sandbox Code Playgroud)

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

F是monad变压器,T是所有monad变压器.回想一下monad变换器是由monad参数化的,它的"输出"是另一个monad,所以它的种类是(*->*) -> (*->*)(或者等价(*->*) -> * -> *).所以,那种MonadTrans

((*->*) -> * -> *) -> *
Run Code Online (Sandbox Code Playgroud)

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

newtype ComposeT f g m a = ...
Run Code Online (Sandbox Code Playgroud)

以下是其完整定义Control.Monad.Trans.Compose:

newtype ComposeT (f :: (* -> *) -> * -> *) (g :: (* -> *) -> * -> *) m a
    = ComposeT { getComposeT :: f (g m) a }
Run Code Online (Sandbox Code Playgroud)

相当满口!f并且g是monad变换器(从他们明确给出的签名中可以看出),m是monad(签名* ->*未明确给出但暗示g m),并且a是常规类型*.总的来说ComposeT是:

((* -> *) -> * -> *) ->
((* -> *) -> * -> *) ->
 (* -> *) -> * -> *
Run Code Online (Sandbox Code Playgroud)