我试图理解以下代码(来自Scalaz库):
def kleisliIdApplicative[R]: Applicative[Kleisli[Id, R, ?]] = ...
我假设某种形式T[P0, ?]
是一个带参数的类型构造函数。但是,我无法找到解释类型参数中问号用法的文档。
相关问题是问号和下划线之间有什么区别?
是否存在所有这些都有详细记录的地方?
答案 0 :(得分:12)
问号语法来自名为kind-projector的编译器插件。
您可以在此处看到它包含在scalaz构建中:https://github.com/scalaz/scalaz/blob/series/7.3.x/project/build.scala#L310
插件翻译
Kleisli[Id, R, ?]
进入(大致)
({type L[A] = Kleisli[Id, R, A]})#L
这是一种相当复杂的方式(但不幸的是Scala中唯一的方法)表达类型lambda,即部分应用的类型构造函数。