0
Functional Programming in 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)的結果(類型F [ B])到所述蓄能器(類型F [列表[B]])
對於我的實施方式中,然後,在traverse
的map2
呼叫(f: (A,B) => C)
部分,List[B]
追加B
到自身。
map2
接受參數F[A]
和F[B]
,但功能參數f
對A
和B
類型的操作。在Scala解決方案中的FP中,B
通過::
運算符被添加到List[B]
。
是嗎?
我可以跟隨你說的大部分內容,但我不知道你是什麼意思的「是對的」?難道你說的是正確的,你的實施是正確的,還是什麼? –
以上所有,請:),老師。由於我的答案類似於官方的答案,但唯一的區別似乎是我'追加',而不是'預先'每個元素到'accumulator'。 –
好吧,你從官方的答案中得到相反的順序,不是嗎? –