为什么不在Scala high-kinded类型参数中嵌套语法

Wei*_*Lin -1 types scala

这是不允许的,一个嵌套类型参数(更高类型,对吧?):

trait Abc[C[T]] {
    def f(): C[T]
  }

cmd13.sc:2: not found: type T
  def f(): C[T]
Run Code Online (Sandbox Code Playgroud)

虽然这是

trait Abc[C[_],T] {
    def f(): C[T]
  }
Run Code Online (Sandbox Code Playgroud)

是否有理由我们需要写Abc [C [_],T]而不是Abc [C [T]]?我的意思是后者更直观.

chi*_*chi 8

Abc[C[T]]语法是不是直观的对我说:好像还只有一个参数,当它有两个.更糟糕的是,考虑一下

def foo[C[T]](x: C[(String, T)]): T = ...
Run Code Online (Sandbox Code Playgroud)

什么会的foo[C[T]]语法表达?它似乎暗示C[_]将在T以后应用,而不是.语法foo[C[_],T]没有这个含义.

由于这个问题被标记为Haskell,让我在Haskell中添加它,我们写

foo :: forall c t. c (String, t) -> t
Run Code Online (Sandbox Code Playgroud)

所以类似的Scala语法会是

def foo[C,T](x: C[(String, T)]): T = ...
Run Code Online (Sandbox Code Playgroud)

如果Scala使用类推断来推断CHaskell 的类型,那么这可以完成.当然,如果C在类型中实际上未使用,那么我们需要一些方法来建议它的类型,例如

foo :: forall (c :: * -> *) t. ...
Run Code Online (Sandbox Code Playgroud)

或依赖于种类多态(如在Haskell中).但这需要更高级的打字引擎.

在Haskell中,GHC开始喜欢在编译器中尝试前沿研究,程序员喜欢这样.在Scala中,开发人员更加保守,但与大多数语言相比,仍然增加了非常先进的东西.毕竟,Scala有更高的种类,这种情况并不普遍 - 即使Scala缺乏类型的推论和类型的多态性,我仍然认为Scala在类型方面相当先进.