gpt4 book ai didi

scala - 什么时候在 Scala 中使用 `with` 代替 `<:` 或 `<:<` 作为边界类型参数?

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

another question , 我建议使用 with平时用的地方<:<:< .因此,不要以以下两种方式之一定义函数:

scala> def f[A,C <: Seq[A]](xs: C) = 0
f: [A, C <: scala.collection.immutable.Seq[A]](xs: C)Int

scala> f(List(1))
<console>:54: error: inferred type arguments [Nothing,List[Int]] do not conform to method f's type parameter bounds [A,C <: scala.collection.immutable.Seq[A]]
f(List(1))
^

scala> implicit def f[A,C](xs: C)(implicit ev: C <:< Seq[A]) = new { def foo = 0 }
f: [A, C](xs: C)(implicit ev: <:<[C,scala.collection.immutable.Seq[A]])java.lang.Object{def foo: Int}

scala> List(0) foo
<console>:54: error: Cannot prove that List[Int] <:< scala.collection.immutable.Seq[A].
List(0) foo
^

scala> f(List(0)) foo
res17: Int = 0

一个人可以这样做:
scala> implicit def f[A,C](xs: C with Seq[A]) = new { def foo = 0 }
f: [A, C](xs: C with scala.collection.immutable.Seq[A])java.lang.Object{def foo: Int}

scala> List(0) foo
res18: Int = 0

我的问题是:除了上述特殊情况,什么时候应该使用 with而不是 <:<:<在类型参数上?为什么不总是使用 with反而?我正在寻找有关此处替代方案之间细微差别的讨论。谢谢。

最佳答案

意义完全不同。 C <: Seq[A]意味着 CSeq[A] 的子类型, 如你所知; xs: C with Seq[A]C 没有任何限制,但意味着 xs应该都是 C和一个 Seq[A] .因此,您通常应该使用您实际指的那个。

def f[A,C <: Seq[A]](xs: C)问题是 Scala 的编译器无法推断 A因为它没有明确出现在参数类型中。原则上我看不出有任何理由无法推断 A ;它只是目前没有。用 C with Seq[A] 替换类型意味着 A现在出现在 xs 的类型中并允许编译器推断 A .所以,如果你真的是指界限,但是 A要推断,你实际上需要写

implicit def f[A,C <: Seq[A]](xs: C with Seq[A])

而不是您的第三个定义,这就是链接问题的答案。

关于scala - 什么时候在 Scala 中使用 `with` 代替 `<:` 或 `<:<` 作为边界类型参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8481109/

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