繁体   English   中英

扩展较高的kinded类型时Scala类型参数与类型字段

[英]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 constructortype T B的情况下,您尝试在定义之前传递它。

higherKind占位符语法将内部type T传递给type constructor

将是一个很好的阅读。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM