当前位置: 首页 > 知识库问答 >
问题:

如何在Clojure中将这个map/flatMap转换成一个用于理解的?

子车才捷
2023-03-14

给定以下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中将这个map/flatMap转换成一个便于理解的?

假设:

  • 如果可能的话,我想使用惯用的Clojure(即mapcat)来表示它,而不是algo.monads/Fluokitten库。但是如果这是最好的方法(我愿意学习),那么就使用它。

共有1个答案

翟卓君
2023-03-14

您可能不会在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)))
  ;=> '()
 类似资料: