Scala Futureはモナドではありません;オプションのようなモナドである何かと比較してください。
私が尋ねている理由は、ダニエル・ウェストハイデの Scalaパート8:未来へようこそ)への初心者のガイド Scala FutureはMonadでしたが、著者はそうではないと答え、それはベースを破棄しました。
FutureはMonadであり、次の定義があると信じています。
_def unit[A](x: A): Future[A] = Future.successful(x)
def bind[A, B](m: Future[A])(fun: A => Future[B]): Future[B] = fut.flatMap(fun)
_
3つの法律を考慮します。
左身元:
Future.successful(a).flatMap(f)
はf(a)
と同等です。小切手。
正しいアイデンティティ:
m.flatMap(Future.successful _)
はm
と同等です(パフォーマンスへの影響を除く)。小切手。
結合性m.flatMap(f).flatMap(g)
はm.flatMap(x => f(x).flatMap(g))
と同等です。小切手。
私が理解しているように、モナドの法則における同等の意味は、プログラムの動作を変更せずに、式の片側をコードの反対側に置き換えることができるということです。常に同じ実行コンテキストを使用すると仮定すると、そうだと思います。 @sukantの例では、Option
の代わりにFuture
を使用していた場合、同じ問題が発生します。先物が熱心に評価されているという事実は関係ないと思います。
他のコメンターが示唆したように、あなたは間違っています。 ScalaのFuture
type hasモナドのプロパティ:
import scala.concurrent.Future
import scala.concurrent.ExecutionContext.Implicits._
def unit[A](block: => A): Future[A] = Future(block)
def bind[A, B](fut: Future[A])(fun: A => Future[B]): Future[B] = fut.flatMap(fun)
これが、ScalaのFutureでfor
- comprehension構文を使用できる理由です。