ter*_*ret 4 collections scala enrich-my-library
希望这将是一个关于图书馆拉皮条的简单问题(因为关于该主题的其他问题往往会产生超出我目前技能水平的答案).
我想要做的就是将集合的交叉产品映射到自身.
val distances = points.crossMap(_ distance _) // points: List[Point3d]
Run Code Online (Sandbox Code Playgroud)
所以我试图皮条客Traversable:
implicit def toSelfCrossMappable[A](xs: Traversable[A]) = new {
def crossMap[B](f: (A, A) => B) = xs.flatMap(a => xs.map(f(a, _)))
}
Run Code Online (Sandbox Code Playgroud)
但它不起作用(它没有进行隐式转换),我不明白为什么不(我对scala很新).我还尝试了使用一种方法在Enriching Scala集合中建议的方法:
implicit def toSelfCrossMappable[A, C[A]](xs: C[A])(implicit c: C[A] => Traversable[A]) = new SelfCrossable[A, C[A]](xs)(c)
class SelfCrossable[A, C](xs: C)(implicit c: C => Traversable[A]) {
def crossMap[B](f: (A, A) => B) = xs.flatMap(a => xs.map(f(a, _)))
}
Run Code Online (Sandbox Code Playgroud)
,但是抛出与我(看起来更简单)方式相同的错误.
我在这做错了什么?
Mil*_*bin 10
它不漂亮,但可以这样做IsTraversableLike,
import scala.language.implicitConversions
import scala.collection.generic.{ CanBuildFrom, IsTraversableLike }
import scala.collection.GenTraversableLike
class SelfCrossMappable[A, Repr](xs: GenTraversableLike[A, Repr]) {
def crossMap[B, That](f: (A, A) => B)
(implicit
cbf: CanBuildFrom[Repr, B, That],
itl: IsTraversableLike[That] { type A = B }
) = xs.flatMap { a => itl.conversion(xs.map(f(a, _)))
}
}
implicit def toSelfCrossMappable[Repr](xs: Repr)
(implicit traversable: IsTraversableLike[Repr]) =
new SelfCrossMappable(traversable.conversion(xs))
Run Code Online (Sandbox Code Playgroud)
示例REPL会话,
scala> List("foo", "foo", "bar").crossMap(_ == _)
res0: List[Boolean] = List(true, true, false, true, true, false, false, false, true)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
531 次 |
| 最近记录: |