[英]Scala type parameter vs. type field when extending higher kinded type
我认为类型字段是类型参数的一个更强大的语法,但是遇到了一个例子,我可以通过后者而不是前者来表达我的意图。 事情是特质A
编译,而特征B
没编。
trait Box[T]
trait A[T] extends (Box[T] => Box[T]) {
override def apply(box: Box[T]): Box[T] = identity(box)
}
trait B extends (Box[T] => Box[T]) {
type T
override def apply(box: Box[T]): Box[T] = identity(box)
}
有没有办法表达A
使用类型字段表达的内容,如B
?
编辑:错误消息:
not found: type T
trait B extends (Box[T] => Box[T]) {
not found: type T
trait B extends (Box[T] => Box[T]) {
override
在当前代码中无用,必要时重新添加。
使用abstract type member
将创建具体类型,以作为带有占位符语法的参数传递。
trait Box[T]
trait A[T] extends (Box[T] => Box[T]) {
def apply(box: Box[T]): Box[T] = identity(box)
}
对于B
,使用type
成员T与Box[T] => Box[T]
将:
强制扩展类以遵守类型绑定。
创建一个具体类型作为参数传递
trait B extends (Box[_] => Box[_]) { type T <: (Box[T] => Box[T]) def apply(box: Box[T]): Box[T] = identity(box) }
编译器告诉你它找不到要传递给type constructor
的type T
在B
的情况下,您尝试在定义之前传递它。
higherKind
占位符语法将内部type T
传递给type constructor
。
这将是一个很好的阅读。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.