2013-12-10 1 views
0

Functional Programming in Scala가 정의 Applicative#traverse 통과 unitmap2 함께구현 실용적 #은

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))(_ :+ _)) 

정의로서 :

def map2[A,B,C](fa: F[A], fb: F[B])(f: (A,B) => C): F[C] 
    def unit[A](a: => A): F[A] 

로서 I 내 구현 이해,,210이되도록 동작한다 : 각

(요소 어큐뮬레이터), 호 MAP2 (ACC, F (ELEM) (_ : + _)) 을 (타입 F를 [F (ELEM)의 결과를 추가 할 누적에 B]) (타입 F [목록 [B]]) 내 구현을 위해

, 다음, traversemap2 통화의 (f: (A,B) => C) 부분에서 List[B] 자체에 B을 추가합니다.

map2 인수를 받아 F[A]F[B]하지만, 함수 인수 fAB 유형에서 작동합니다. Scala 솔루션의 FP에서 B:: 연산자를 통해 List[B]에 추가됩니다.

맞습니까?

+0

나는 당신이 말하는 대부분을 따라갈 수 있지만, 나는 그것이 "옳다"라는 것이 무엇을 의미하는지 모른다. 당신이 말한 것이 정확하고, 당신의 구현은 정확합니까? 아니면 무엇입니까? –

+0

위의 모든 것, 제발 :) 선생. 내 대답은 공식 답변과 비슷하지만, 유일한 차이점은 '누적 기'에 각 요소를'prepending '하는 것이 아니라'appending'이라는 것입니다. –

+1

글쎄, 당신은 공식적인 답변에서 역순으로 원소를 얻지, 안 그래? –

답변

1

당신은 무슨 일이 일어나고 있는지 정확하게 이해하고 있습니다. 그러나 구현시 예상되는 순서의 역순으로 목록이 생성되므로 ID 모나드를 F으로 사용하면 동일한 목록 대신 역순으로 된 목록이 반환됩니다.

관련 문제