给定this Scala code :
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 转换为 for comprehension?
假设:
- 如果可能的话,我想使用惯用的 Clojure(即
mapcat
)来表示它,而不是algo.monads
/fluokitten
库.但如果这是最好的方法(我愿意学习),那么就使用它。
最佳答案
你可能不会在 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)))
;=> '()
关于scala - 如何将此 map/flatMap 转换为 Clojure 中的 for comprehension?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25655132/