Scala中的函数编程将Applicative#traverse定义为:
def traverse[A,B](as: List[A])(f: A => F[B]): F[List[B]]
as.foldRight(unit(List[B]()))((a, fbs) => map2(f(a), fbs)(_ :: _))但是,我将这一职能作为:
def traverse[A,B](as: List[A])(f: A => F[B]): F[List[B]] =
as.foldRight(unit(List[B]()))((elem, acc) => map2(acc, f(elem))(_ :+ _))将unit和map2定义为:
def map2[A,B,C](fa: F[A], fb: F[B])(f: (A,B) => C): F[C]
def unit[A](a: => A): F[A]在我理解我的实现时,map2(acc, f(elem))(_ :+ _))的行为将是这样的:
对于每个(元素、累加器),调用map2(acc,f(elem)(_ :+ _))将f(elem) (类型FB)的结果附加到累加器(F[ListB]类型)
因此,对于我的实现,在(f: (A,B) => C)部分的traverse的map2调用中,List[B]会将B附加到自己。
map2接受参数F[A]和F[B],但是函数参数f在A和B类型上运行。在Scala解决方案中的FP中,B通过::运算符添加到List[B]中。
是那么回事吗?
发布于 2013-12-11 02:08:02
你对正在发生的事情的理解是正确的。但是,请注意,您的实现将按照预期的相反顺序生成一个列表,因此如果您使用identity monad作为F,您将得到一个相反的列表,而不是相同的列表。
https://stackoverflow.com/questions/20485363
复制相似问题