2013-12-10 268 views
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))(_ :+ _)) 

隨着unitmap2定義爲:

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]])

對於我的實施方式中,然後,在traversemap2呼叫(f: (A,B) => C)部分,List[B]追加B到自身。

map2接受參數F[A]F[B],但功能參數fAB類型的操作。在Scala解決方案中的FP中,B通過::運算符被添加到List[B]

是嗎?

+0

我可以跟隨你說的大部分內容,但我不知道你是什麼意思的「是對的」?難道你說的是正確的,你的實施是正確的,還是什麼? –

+0

以上所有,請:),老師。由於我的答案類似於官方的答案,但唯一的區別似乎是我'追加',而不是'預先'每個元素到'accumulator'。 –

+1

好吧,你從官方的答案中得到相反的順序,不是嗎? –

回答

1

你對你的理解是正確的。但是,請注意,您的實現將按預期內容的相反順序生成一個列表,因此如果您使用身份monad作爲F,則會返回反向列表,而不是同一個列表。