0

次の特性を実装するためのScala演習での関数型プログラミングに取り組んでいます。List[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
    }
}
4

1 に答える 1

3

本の間違いです。github のソースを見ると、ゼロのメソッド パラメータが表示されます。

https://github.com/pchiusano/fpinscala/blob/master/exercises/src/main/scala/fpinscala/monoids/Monoid.scala#L84

trait Foldable[F[_]] {
  import Monoid._

  def foldRight[A, B](as: F[A])(z: B)(f: (A, B) => B): B =
    sys.error("todo")

  def foldLeft[A, B](as: F[A])(z: B)(f: (B, A) => B): B =
    sys.error("todo")

  def foldMap[A, B](as: F[A])(f: A => B)(mb: Monoid[B]): B =
    sys.error("todo")

  def concatenate[A](as: F[A])(m: Monoid[A]): A =
    sys.error("todo")

  def toList[A](as: F[A]): List[A] =
    sys.error("todo")
}
于 2013-10-29T03:53:26.773 に答える