通过使用自己的方法扩展 TraversableLike 来丰富我的库
我尝试用自己的方法扩展 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 (_ - _)
这段代码工作正常,它计算了列表元素之间的差异。但我想要这样的代码,它可以与 Seq
、Set
等一起使用,而不仅仅是与 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
根据雷克斯的评论,我编写了以下代码:
这按预期工作。
Based on Rex' comment I have written following code:
This works as expected.