如何使用我自己的通用“映射”丰富Scala集合(正确的方法)?
我正试图用我自己的如何使用我自己的通用“映射”丰富Scala集合(正确的方法)?,scala,Scala,我正试图用我自己的map方法丰富Scala集合,我很接近,但隐式转换不起作用。除此之外,我还有什么遗漏吗?我正在查看网络上的各种其他资源,包括一些答案,这些答案被标记为重复的问题,许多问题在这里和那里遗漏了一些内容(例如使用C[A]conv(列表(1,2,3)) res39:java.lang.Object{def mymap[B,D](f:Int=>B)(隐式B:scala.collection.generic.CanBuildFrom[List[Int],B,D]):D}=$$$$$$2C9
map
方法丰富Scala集合,我很接近,但隐式转换不起作用。除此之外,我还有什么遗漏吗?我正在查看网络上的各种其他资源,包括一些答案,这些答案被标记为重复的问题,许多问题在这里和那里遗漏了一些内容(例如使用C[A]conv(列表(1,2,3))
res39:java.lang.Object{def mymap[B,D](f:Int=>B)(隐式B:scala.collection.generic.CanBuildFrom[List[Int],B,D]):D}=$$$$$$2C9D7A9074166DE3BF866CF7C45A3ED$$$$$anon$1@3ed0eea6
scala>conv(列表(1,2,3))mymap(U1)
res40:List[Int]=List()
scala>conv(位集(1,2,3))mymap(uz+1)
res41:scala.collection.immutable.BitSet=BitSet()
scala>conv(位集(1,2,3))mymap(u.toFloat)
res42:scala.collection.immutable.Set[Float]=Set()
scala>List(1,2,3)mymap(uz+1)
:168:错误:无法证明List[Int]implicit def conv[A,C](xs:C)(implicit ev:C=>GenTraversable[A])=new{
|def mymap[B,D](f:A=>B)(隐式B:CanBuildFrom[GenTraversable[A],B,D]):D=
|xs图f
| }
conv:[A,C](xs:C)(隐式ev:C=>scala.collection.GenTraversable[A])java.lang.Object{def mymap[B,D](f:A=>B)(隐式B:scala.collection.generic.CanBuildFrom[scala.collection.GenTraversable[A],B,D]):D}
scala>conv(数组(1))mymap(U1)
res6:scala.collection.GenTraversable[Int]=ArrayBuffer(2)
scala>数组(1)mymap(uz+1)
:68:错误:数组[Int]=>scala.collection.GenTraversable[A]中没有可用的隐式视图。
数组(1)mymap(z+1)
^
我已经回答了一个类似的问题。你也可以参考雷克斯·克尔(Rex Kerr)对如何进行这种拉皮条的一般解释。我上周刚刚回答了。下面是代码:
implicit def conv[A,C <: GenTraversable[A]](xs: C with GenTraversableLike[A,C]) = new {
def mymap[B,D](f: A => B)(implicit b: CanBuildFrom[C,B,D]): D = {
val builder = b(xs)
xs foreach { x => builder += f(x) }
builder.result
}
}
implicit def conv[A,cb](implicit B:CanBuildFrom[C,B,D]):D={
val builder=b(xs)
xs foreach{x=>builder+=f(x)}
结果
}
}
在这种情况下,我可以使用GenTraversable
而不是GenTraversableLike
。我更喜欢后者,因为它提供了更多功能
问题在于声明
[A,C可能重复您添加了不需要的需求,至少在您的示例中不需要。如果您提出了一个用例,其中必须有@RexKerr,那么我正在使用@DanielC.Sobral:这一个不是pimpy:)我已经看到了两个线程,它们并没有回答我的问题。例如,我在这里使用的类型参数似乎是与@missingfactor的另一个答案中的答案一致,但是隐式无法工作-请随意告诉我如何使其工作。RexKerr的答案依赖于C和D作为类型构造函数(虽然我可以使C作为类型构造函数工作,但这再次被打破,而D作为类型构造函数我根本无法工作).Ugh,还有一条需要记住的规则:使用和来绕行。你能解释一下为什么你把C既限制为GenTraversable[A]
又限制为GenTraversable[A,C]
?为什么/什么时候with
起作用但不Argh,您的解决方案是不可行的:它不适用于数组
s,因为它们反过来需要隐式转换才能成为集合,所以with
在这里不起作用。一般来说,这需要处理任何可以被视为集合的类型,因为我希望事情能够正常运行我好像向集合层次结构本身添加了一个方法。更新了我的问题。此外,我希望通过问这个问题来了解这些类型的问题。
implicit def conv[A,C <: GenTraversable[A]](xs: C with GenTraversableLike[A,C]) = new {
def mymap[B,D](f: A => B)(implicit b: CanBuildFrom[C,B,D]): D = {
val builder = b(xs)
xs foreach { x => builder += f(x) }
builder.result
}
}