gpt4 book ai didi

scala - 为什么 Scala 中的 f-bounded 多态性通常使用类型上限和自身类型来实现

转载 作者:行者123 更新时间:2023-12-04 03:25:37 26 4
gpt4 key购买 nike

为什么 Scala 中的 f-bounded 多态性通常用类型上界以及像这样的自类型来实现

trait MyTrait[A <: MyTrait[A]] { self: A =>

}

而且不仅仅是只是

这样的 self 类型
trait MyTrait[A] { self: A =>

}

第一个例子中的上限类型似乎是不必要的。至少我找不到使用一个的任何好处。我在这里忽略了什么吗?然而,类型界限确实阻碍了像

这样的用法
def func[A](implicit ev: A <:< MyTrait[A]) = ???

(当然,在这个简单而人为的示例中,func[A <: MyTrait[A]] 可以解决问题,但在更复杂的设置中可能无法解决)

我发现 f-bounded 多态性在多个库中实现,甚至在关于该主题的介绍性博客文章中 (https://tpolecat.github.io/2015/04/29/f-bounds.html),我想知道是否省略一般类型绑定(bind)。

最佳答案

所以,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 - 为什么 Scala 中的 f-bounded 多态性通常使用类型上限和自身类型来实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67669017/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com