我刚刚了解了更高级的类型,但我提供的每个示例都只使用了(* -> *) -> *
等Functor
,((* -> *) -> *) -> *
。
在Scala中,使用了一个奇怪的 trait 定义,在Haskell中,使用了类型。并且这两种方法似乎都不能更多地使用一种抽象程度(即#bottom
)。
我既不是Scala也不是Haskell的专家,所以如果你能提供简单这类更高学位类型的例子,如果它们完全可以表达的话,将会有所帮助。
答案 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 }
非常满口! f
和g
是monad变换器(从明确给出的签名中可以看出),m
是monad(签名* ->*
未明确给出,但由{{隐含1}}),g m
是常规类型a
。所以*
的总体类型是:
ComposeT