dom*_*min 2 haskell scala traits typeclass higher-kinded-types
我刚刚学会了更高级的kinded类型,但我提供的每个例子都只使用了2级(* -> *) -> *,就像Functor.
在Scala中,使用了奇怪的特征定义,在Haskell中,使用了类型类.并且这两种方法似乎都不能更多地使用一种抽象(即((* -> *) -> *) -> *).
我既不是Scala也不是Haskell的专家,所以如果你能提供这种更高等级类型的简单例子,如果它们可以表达的话,那将会很有帮助.
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
在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)