gpt4 book ai didi

scala - 如何将基于交叉产品的方法添加到 Scala 集合?

转载 作者:行者123 更新时间:2023-12-04 22:21:44 24 4
gpt4 key购买 nike

希望这将是一个关于图书馆拉皮条的简单问题(因为关于该主题的其他问题往往会产生超出我当前技能水平的答案)。

我想要做的就是映射一个集合与它自己的叉积。

val distances = points.crossMap(_ distance _)  // points: List[Point3d]

所以我试图这样拉皮条 Traversable:
implicit def toSelfCrossMappable[A](xs: Traversable[A]) = new {
def crossMap[B](f: (A, A) => B) = xs.flatMap(a => xs.map(f(a, _)))
}

但它不起作用(它没有进行隐式转换),我不明白为什么不(我对 Scala 很陌生)。我还尝试了 Enriching Scala collections with a method 中建议的方法,这给我留下了:
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, _)))
}

,但这会引发与我的(看起来更简单的)方式相同的错误。

我在这里做错了什么?

最佳答案

这不是很漂亮,但这可以用 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))

示例 REPL session ,
scala> List("foo", "foo", "bar").crossMap(_ == _)
res0: List[Boolean] = List(true, true, false, true, true, false, false, false, true)

关于scala - 如何将基于交叉产品的方法添加到 Scala 集合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16393015/

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