3

この Scala コードを考えると:

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の理解のためにどのように変換するのですか?

仮定:

  • 可能であれば、慣用的な Clojure (つまり ) を使用して、 /ライブラリmapcatではなくこれを表現したいと思います。しかし、それが最善の方法である場合 (私は学ぶことにオープンです)、それを使用します。algo.monadsfluokitten
4

1 に答える 1

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)))
  ;=> '()
于 2014-09-04T04:17:40.947 に答える