2

Scala では、Futureの成功した結果に対して関数を実行するためmapに andを使用できます。flatMap

val x: Future[Int] = ...
val y: Future[String] = x.map(_.toString)

これよりも優れたClojure類似物はありますか:

(def x (promise))
(def y (future (str @x)))

の配信を待っている間、上記はスレッドをブロックしませんxか?

4

1 に答える 1

2

y ie の値を dref しようとするまで、あなたの clojure コードはブロックされません。

(def x (promise)) ;wont block
(def y (future (str @x)))  ;wont block
(print @y) ;will block

類推に関する限り、コードは問題ないように見えます。しかし、Future をチェーンするためのより宣言的な方法 (概念的には削減) が必要な場合は、reduce以下に示すように使用できます。

(def x (promise))
(def final (reduce #(future (%2 @%1)) 
                   x 
                   [inc dec (partial + 10) str]))

(deliver x 10)
@final => "20"

スレッド化マクロに似ているが、スレッド化された式ごとにフューチャを作成するマクロを考え出すこともでき->, ->>ますが、通常の関数を使用してこれを実行できるとしたら、やり過ぎになると思います。

于 2013-01-30T10:41:03.750 に答える