继续开展Functional Programming in Scala练习,我正在努力在foldRight
类型上实施IndexedSeq
。
由于foldRight将使用right associativity
进行评估,因此我为模式匹配创建了以下运算符。
object :++ {
def unapply[T](s: Seq[T]) = s.lastOption.map(last =>
(last, s.take(s.length - 1)))
}
然后如此实施:
object IndexedSeqFoldable extends Foldable[IndexedSeq] {
override def foldRight[A, B](as: IndexedSeq[A])(z: B)(f: (A, B) => B): B = {
def go(bs: Seq[A], acc: B): B = bs match {
case x :++ xs => go(xs, f(x, acc))
case _ => acc
}
go(as, z)
}
忽略foldRight
可以用foldLeft
写的事实,我的方法如何保持?