Scala视图边界与子类型一起使用?

时间:2011-10-20 00:20:41

标签: scala

Scala中是否存在绑定视图但可以匹配子类型的任何内容?

由于Scala中的视图不链接,我目前有以下内容:

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的直接视图(只有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]) = ...

有更好的方法吗?

1 个答案:

答案 0 :(得分:0)

视图绑定签名有两个问题。首先,Iterable没有length,只有size。接下来,I不是类型cosntructor。因此,修复两者,签名是:

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

这是正确的。如果您参数化I,则会排除BitSetString等类型。