2014-09-03 6 views
3

this Scala code을 감안할 때 : 다음 이해력이 변환됩니다이지도/flatMap을 Clojure의 이해력으로 변환하는 방법?

def compute2(maybeFoo: Option[Foo]): Option[Int] = 
    maybeFoo.flatMap { foo => 
    foo.bar.flatMap { bar => 
     bar.baz.map { baz => 
     baz.compute 
     } 
    } 
    } 

:

def compute2(maybeFoo: Option[Foo]): Option[Int] = 
    for { 
    foo <- maybeFoo 
    bar <- foo.bar 
    baz <- bar.baz 
    } yield baz.compute 

내 질문은 방법 Clojure의에서 이해의에이지도/flatMap을 변환하는 것입니다?

가정 :

  • 내가 관용적 Clojure의을 사용하고 싶습니다 가능하면 (즉 mapcat)는 algo.monads/fluokitten 라이브러리 대신이를 나타냅니다. 그러나 이것이 그것을하기위한 최선의 방법이라면 (나는 배우기에 열심이다) 그런 다음 그것을 사용하십시오.

답변

2
당신은 아마 Clojure의에서 Option를 사용하지 것이지만, 객체 내부 컬렉션 인 경우이 같은 일을해야

:

(let [maybe-foo [{:bar [{:baz [(fn [] 42)]}]}]] 
    (for [foo maybe-foo 
     bar (:bar foo) 
     baz (:baz bar)] 
    (baz))) 
;=> '(42) 

(let [maybe-foo [{:bar nil}]] 
    (for [foo maybe-foo 
     bar (:bar foo) 
     baz (:baz bar)] 
    (baz))) 
;=> '() 

(let [maybe-foo nil] 
    (for [foo maybe-foo 
     bar (:bar foo) 
     baz (:baz bar)] 
    (baz))) 
    ;=> '() 
+0

확인을 - 그래서 우리는'Option'을 사용하고 싶다면 - 우리가 ' 다시 'algo.monads' http://onclojure.com/2009/03/05/a-monad-tutorial-for-clojure-programmers-part-1/ - 그게 맞습니까? – hawkeye

+0

@hawkeye,'for'를 사용하려면 시퀀스로 포장 된 객체를 가져야합니다. 그렇지 않다면 'algo.monads' (또는 자신 만의 롤)를 사용해야 할 것입니다. – ponzao

+0

좋아 - 당신은 이해력이 기본적으로 let-block이있는 루프를 맨 위에서 말하고있는 것입니까? – hawkeye