web-dev-qa-db-ja.com

Future in Scala a monad?

Scala Futureはモナドではありません;オプションのようなモナドである何かと比較してください。

私が尋ねている理由は、ダニエル・ウェストハイデの Scalaパート8:未来へようこそ)への初心者のガイド Scala FutureはMonadでしたが、著者はそうではないと答え、それはベースを破棄しました。

45
Nietzsche

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つの法律を考慮します。

  1. 左身元:

    Future.successful(a).flatMap(f)f(a)と同等です。小切手。

  2. 正しいアイデンティティ:

    m.flatMap(Future.successful _)mと同等です(パフォーマンスへの影響を除く)。小切手。

  3. 結合性m.flatMap(f).flatMap(g)m.flatMap(x => f(x).flatMap(g))と同等です。小切手。

「代替なしで、法律が破られる」への反論

私が理解しているように、モナドの法則における同等の意味は、プログラムの動作を変更せずに、式の片側をコードの反対側に置き換えることができるということです。常に同じ実行コンテキストを使用すると仮定すると、そうだと思います。 @sukantの例では、Optionの代わりにFutureを使用していた場合、同じ問題が発生します。先物が熱心に評価されているという事実は関係ないと思います。

4
Thayne

他のコメンターが示唆したように、あなたは間違っています。 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構文を使用できる理由です。

2
0__