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]) = ...
有更好的方法吗?
答案 0 :(得分:0)
视图绑定签名有两个问题。首先,Iterable
没有length
,只有size
。接下来,I
不是类型cosntructor。因此,修复两者,签名是:
implicit def pimpIterable[A, I <% Iterable[A]](x: I) = new { def mylength = x.size }
这是正确的。如果您参数化I
,则会排除BitSet
和String
等类型。