通过使用自己的方法扩展 TraversableLike 来丰富我的库

发布于 2024-10-31 19:04:10 字数 1176 浏览 0 评论 0原文

我尝试用自己的方法扩展 TraversableLike,但失败了。

首先,看看我想要实现什么:

class RichList[A](steps: List[A]) {
  def step(f: (A, A) => A): List[A] = {
    def loop(ret: List[A], steps: List[A]): List[A] = steps match {
      case _ :: Nil => ret.reverse.tail
      case _ => loop(f(steps.tail.head, steps.head) :: ret, steps.tail)
    }
    loop(List(steps.head), steps)
  }
}
implicit def listToRichList[A](l: List[A]) = new RichList(l)

val f = (n: Int) => n * (2*n - 1)
val fs = (1 to 10) map f
fs.toList step (_ - _)

这段代码工作正常,它计算了列表元素之间的差异。但我想要这样的代码,它可以与 SeqSet 等一起使用,而不仅仅是与 List 一起使用。

我尝试过:

class RichT[A, CC[X] <: TraversableLike[X, CC[X]]](steps: CC[A]) {
  def step(f: (A, A) => A): CC[A] = {
    def loop(ret: CC[A], steps: CC[A]): CC[A] =
      if (steps.size > 1) loop(ret ++ f(steps.tail.head, steps.head), steps.tail)
      else ret.tail
    loop(CC(steps.head), steps)
  }
}
implicit def tToRichT[A, CC[X] <: TraversableLike[X, CC[X]]](t: CC[A]) = new RichT(t)

有几个错误。隐式转换和 ++-method 都可以工作。另外,我不知道如何创建一个新类型的 CC - 请参阅循环的调用。

I tried to extend TraversableLike with my own methods, but I failed.

First, see what I wanna achieve:

class RichList[A](steps: List[A]) {
  def step(f: (A, A) => A): List[A] = {
    def loop(ret: List[A], steps: List[A]): List[A] = steps match {
      case _ :: Nil => ret.reverse.tail
      case _ => loop(f(steps.tail.head, steps.head) :: ret, steps.tail)
    }
    loop(List(steps.head), steps)
  }
}
implicit def listToRichList[A](l: List[A]) = new RichList(l)

val f = (n: Int) => n * (2*n - 1)
val fs = (1 to 10) map f
fs.toList step (_ - _)

This code works fine and it calculates me the differences between the list elements. But I wanna have such a code that works with Seq, Set etc. and not only with List.

I tried this:

class RichT[A, CC[X] <: TraversableLike[X, CC[X]]](steps: CC[A]) {
  def step(f: (A, A) => A): CC[A] = {
    def loop(ret: CC[A], steps: CC[A]): CC[A] =
      if (steps.size > 1) loop(ret ++ f(steps.tail.head, steps.head), steps.tail)
      else ret.tail
    loop(CC(steps.head), steps)
  }
}
implicit def tToRichT[A, CC[X] <: TraversableLike[X, CC[X]]](t: CC[A]) = new RichT(t)

There are several errors. Either the implicit conversion nor the ++-method work. Also, I don't know how to create a new type CC - see the call of the loop.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

情深缘浅 2024-11-07 19:04:10

根据雷克斯的评论,我编写了以下代码:

class RichIter[A, C[A] <: Iterable[A]](ca: C[A]) {
  import scala.collection.generic.CanBuildFrom
  def step(f: (A, A) => A)(implicit cbfc: CanBuildFrom[C[A], A, C[A]]): C[A] = {
    val iter = ca.iterator
    val as = cbfc()

    if (iter.hasNext) {
      var olda = iter.next
      as += olda
      while (iter.hasNext) {
        val a = iter.next
        as += f(a, olda)
        olda = a
      }
    }
    as.result
  }
}
implicit def iterToRichIter[A, C[A] <: Iterable[A]](ca: C[A]) = new RichIter[A, C](ca)

val f = (n: Int) => n * (2*n - 1)
val fs = (1 to 10) map f
fs step (_ - _)

这按预期工作。

Based on Rex' comment I have written following code:

class RichIter[A, C[A] <: Iterable[A]](ca: C[A]) {
  import scala.collection.generic.CanBuildFrom
  def step(f: (A, A) => A)(implicit cbfc: CanBuildFrom[C[A], A, C[A]]): C[A] = {
    val iter = ca.iterator
    val as = cbfc()

    if (iter.hasNext) {
      var olda = iter.next
      as += olda
      while (iter.hasNext) {
        val a = iter.next
        as += f(a, olda)
        olda = a
      }
    }
    as.result
  }
}
implicit def iterToRichIter[A, C[A] <: Iterable[A]](ca: C[A]) = new RichIter[A, C](ca)

val f = (n: Int) => n * (2*n - 1)
val fs = (1 to 10) map f
fs step (_ - _)

This works as expected.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文