gpt4 book ai didi

与子类型一起使用的 Scala View 边界?

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

Scala 中是否有类似 View 绑定(bind)但可以匹配子类型的东西?

由于 Scala 中的 View 没有链接,我目前有以下内容:

implicit def pimpIterable[A, I[_]](x: I[A])(implicit f: I[A] => Iterable[A]) =
new { def mylength = x.size }

让我写:
Array(1,2,3).mylength
Seq(1,2,3).mylength

上面的表格似乎是必要的,因为如果我尝试使用以下内容简化我的函数签名:
implicit def pimpIterable[A, I <% Iterable[A]](x: I) =
new { def mylength = x.size }

那么隐式转换将不适用于数组,因为没有从 Array 到 Iterable 的直接 View (仅到 Iterable 的子类,第一种形式能够找到)。

这也迫使所有其他短手也以长形式写出。可能是什么:
implicit def pimpIterable[A: Scalar, I <% Iterable[A]](x: I) = ...

现在必须写成:
implicit def pimpIterable[A, I[_]](x: I[A])(implicit f: I[A] => Iterable[A], m: Scalar[A]) = ...

有没有更好的办法?

最佳答案

View 绑定(bind)签名存在两个问题。一、Iterable没有 length , 仅 size .接下来,I不是类型构造函数。因此,修复两者,签名是:

implicit def pimpIterable[A, I <% Iterable[A]](x: I) = new { def mylength = x.size }

这是正确的。如果参数化 I ,它将排除 BitSet 等类型和 String .

关于与子类型一起使用的 Scala View 边界?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7829765/

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