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.monads/fluokitten库。但是,如果这是最好的方法(我愿意学习),那就使用它。
4

1 回答 1

2

你可能不会Option在 Clojure 中使用,但如果对象在集合中,这样的东西应该可以工作:

(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 回答