为什么 Scala 中的 f-bounded 多态性通常使用类型上限和自身类型来实现
Why is f-bounded polymorphism im Scala commonly implemented with an upper type bound as well as a self type
为什么 Scala 中的 f-bounded 多态性通常使用类型上限 以及 像
这样的自类型来实现
trait MyTrait[A <: MyTrait[A]] { self: A =>
…
}
而不只是 只是 像
这样的自我类型
trait MyTrait[A] { self: A =>
…
}
第一个例子中的类型上限似乎是不必要的。至少我找不到使用一个的任何好处。我在这里忽略了什么吗?然而,类型界限确实阻碍了像
这样的用法
def func[A](implicit ev: A <:< MyTrait[A]) = ???
(当然,在这个简单而人为的示例中,func[A <: MyTrait[A]]
可以解决问题,但在更复杂的设置中可能无法解决)
我发现 f-bounded 多态性 实现了 一个绑定在多个库中的类型,甚至在关于该主题的介绍性博客 post 中 (https://tpolecat.github.io/2015/04/29/f-bounds.html)并且想知道一般情况下省略类型绑定是否会更好。
所以,trait MyTrait[A <: MyTrait[A]] { self: A => ... }
的思路就是强制A
成为当前实现的类型。
如果你省略上限,那么,除了 Foo
不能用它的类型参数做很多事情(它对它的成员一无所知),你也可以做这样的事情,这不是很有用。
trait Foo[A] { self: A => }
trait Bar
class Baz extends Foo[Bar] with Bar
甚至只是 class Bat extends Foo[Any]
为什么 Scala 中的 f-bounded 多态性通常使用类型上限 以及 像
这样的自类型来实现trait MyTrait[A <: MyTrait[A]] { self: A =>
…
}
而不只是 只是 像
这样的自我类型trait MyTrait[A] { self: A =>
…
}
第一个例子中的类型上限似乎是不必要的。至少我找不到使用一个的任何好处。我在这里忽略了什么吗?然而,类型界限确实阻碍了像
这样的用法def func[A](implicit ev: A <:< MyTrait[A]) = ???
(当然,在这个简单而人为的示例中,func[A <: MyTrait[A]]
可以解决问题,但在更复杂的设置中可能无法解决)
我发现 f-bounded 多态性 实现了 一个绑定在多个库中的类型,甚至在关于该主题的介绍性博客 post 中 (https://tpolecat.github.io/2015/04/29/f-bounds.html)并且想知道一般情况下省略类型绑定是否会更好。
所以,trait MyTrait[A <: MyTrait[A]] { self: A => ... }
的思路就是强制A
成为当前实现的类型。
如果你省略上限,那么,除了 Foo
不能用它的类型参数做很多事情(它对它的成员一无所知),你也可以做这样的事情,这不是很有用。
trait Foo[A] { self: A => }
trait Bar
class Baz extends Foo[Bar] with Bar
甚至只是 class Bat extends Foo[Any]