更高程度的高级类型?

时间:2017-11-24 07:53:26

标签: scala haskell traits typeclass higher-kinded-types

我刚刚了解了更高级的类型,但我提供的每个示例都只使用了(* -> *) -> *Functor((* -> *) -> *) -> *

在Scala中,使用了一个奇怪的 trait 定义,在Haskell中,使用了类型。并且这两种方法似乎都不能更多地使用一种抽象程度(即#bottom)。

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

2 个答案:

答案 0 :(得分:5)

string | "literal"

<强> 编辑:

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

阶&GT; :kind -v Map

答案 1 :(得分:5)

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

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

其类型为T->*,其中T是其参数类型F

F是monad变换器,T是所有monad变换器的类型。回想一下monad变换器是由monad参数化的,它的“输出”是另一个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(签名* ->*未明确给出,但由{{隐含1}}),g m是常规类型a。所以*的总体类型是:

ComposeT