2013-10-29 106 views
0

我正在进行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 
    } 
} 
+0

我想你错过了一些代码。你的'concatenate'函数有3个curried参数,'foldLeft'只提到2个。在任何情况下,对于'fold'成功,它需要三件事情:一个起始列表,一个起始项目(或第零项)和一个减少/折叠功能。 –

回答

3

这是本书中的错误。看看github上源,你会看到一个零方法PARAM:

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") 
} 
+0

实现'Foldable [List]'时,它的签名是什么?我尝试过'可折叠[List]'特性,但得到了编译时错误,这种特性已经存在。 –

+0

看看源代码中的版本,他们使用一个对象:https://github.com/pchiusano/fpinscala/blob/master/exercises/src/main/scala/fpinscala/monoids/Monoid.scala#L103 – Noah

+0

谢谢,诺亚。另外,根据上述签名,使用'F [A]'时,我得到多个'Foldable.scala:15:error:not found:type F'编译时错误。 –