我正在进行Functional Programming in Scala练习以实现List[A]
以下特质。实现折叠[列表[A]]
trait Foldable[F[_]] {
def foldRight[A, B](as: F[A])(f: (A, B) => B): B
def foldLeft[A, B](as: F[A])(f: (B, A) => B): B
def foldMap[A, B](as: F[A])(f: A => B)(mb: Monoid[B]): B
def concatenate[A](as: F[A])(m: Monoid[A]): A = foldLeft(as)(m.zero)(m.op)
}
在我尝试实现foldLeft
,我怎么可以指定initial
值,如果有没有在签名?
trait Foldable[List[_]] {
def foldLeft[A,B](as: List[A])(f: (A, B) => B): B = {
go(bs: List[A], acc: B): B = bs match {
case x :: xs => go(xs, f(x, acc))
case Nil => acc
}
go(as, ???) // No start value in the signature? And no Monoid for m.zero
}
}
我想你错过了一些代码。你的'concatenate'函数有3个curried参数,'foldLeft'只提到2个。在任何情况下,对于'fold'成功,它需要三件事情:一个起始列表,一个起始项目(或第零项)和一个减少/折叠功能。 –