scala - 如何将此 map/flatMap 转换为 Clojure 中的 for comprehension?

标签 scala clojure monads for-comprehension flatmap

给定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/

相关文章:

Scala - 匿名函数的递归

ajax - Finatra 访问控制允许来源

clojure - Clojure REPL 中是否可以有 _good_ tab 补全?

haskell - 我可以用 callCC 做什么而不能用 cont 完成?

java - Option[T] 类的意义何在?

java - 在 GAE 上部署 scala 类时出现 classnotfound 异常

C# dotnet "Require"和断言

clojure - 有没有一种惯用的方法来干燥 clojure 中类似的函数定义?

clojure - 打ic 1.0.0-beta1错误

state - MonadState get 和 put 的原因?