这是不允许的,一个嵌套类型参数(更高类型,对吧?):
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]]?我的意思是后者更直观.
该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在类型方面相当先进.
| 归档时间: |
|
| 查看次数: |
175 次 |
| 最近记录: |