1

Michael Pilquist の優れた状態モナドの講義を勉強しています。54 分で 2 つの質問に行き詰まりました。

  1. ofsが の場合Option[FollowerStats]?演算子は何ですか? Scala 2.10.2 の Option に三項演算子が見つかりません

  2. 最後のジェネレーターは、更新されたキャッシュ (ヒットまたはミスがインクリメントされたもの) をStatecheckCache メソッドの結果にどのように戻しますか? 返さStateれたものは破棄されたようで、理解のためにはOption[FollowerStats]

.

def checkCache(u: String): State[Cache, Option[FollowerState]] = for {
    c <- State.get[Cache]
    ofs <- State.state {
        c.get(u).collect {
            case Timestamped(fs, ts) if !state(ts) => fs
        }
    }
    _ <- State.put(ofs ? c.recordHit | c.recordMiss)
} yield ofs

理解しようと、理解のために書き直そうとしましたが、助けにはなりませんでした。

State.get[Cache].flatMap{ c => 
    State.state{c.get(u).collect(...)}.flatMap{ ofs =>
        State.put(ofs ? c.recordHit | c.recordMiss).map{ _ =>
            ofs
        }
    }
}

更新: 回答のおかげで、ポイント 2 の鍵をつかんだと思います。yield が本質的に言っていることを認識していませんでした:s => (s,())から最後の状態を取得し、値の型を ofs にput置き換えて、重要なのは、yield が文字通り ofs を返すのではなく、State.map として変換されていることを認識していることだと思います。Units =>(s,ofs)

更新 オプションビットを今すぐ理解してください。状態モナドを導出しているにもかかわらず、プレゼンテーションはまだ Scalaz の暗黙を使用していると思います。

4

2 に答える 2

2

まずは三項演算子。

ofs ? c.recordHit | c.recordMiss

以下と同等です:

if (ofs.isDefined) c.recordHit else c.recordMiss

または:

ofs.fold(c.recordMiss)(_ => c.recordHit)

これは Scalaz によって提供され、メソッドを持つクラスを返すためのメソッドをOptionOps提供する暗黙のクラス ( )として実装されます。これは、余分な簡潔さが混乱に値するかどうかはわかりませんが、人々はそれを使用しているので、知っておく価値があります.?OptionConditional|

状態の更新については、次の単純化された例を検討してください。

val inc: State[Int, Unit] = for { i <- get[Int]; _ <- put(i + 1) } yield ()

最初は、状態を「破棄」して単位を生成するだけのように見えるかもしれませんが、 の値incは実際には状態を操作する計算全体 (この場合、関連する値や興味深い値を返さないもの) であり、アップデート。

于 2013-10-08T10:12:57.337 に答える
1
  1. この?|演算子は、scalaz のブール構文から来ています。BooleanOpsをご覧ください。実際には 2 つの機能があります。最初?に.|Conditional

  2. 更新されたキャッシュは、実際にはStateアクションを実行した結果です。ビデオの前半を見ると、状態アクションと初期状態が与えられ、状態アクションを実行して次のペアである結果Stateとして定義されているはずです: (a) 計算された値(タプル) 渡された状態から、および (b) アクションが実行された後の新しい状態 ( として表されます)。ss(a, s2)as2

モナド アクションを介して initial が実行されるまで、 newCacheは実際には計算されないことに注意してください。Cache

于 2013-10-08T10:05:52.837 に答える