Michael Pilquist の優れた状態モナドの講義を勉強しています。54 分で 2 つの質問に行き詰まりました。
ofs
が の場合Option[FollowerStats]
、?
演算子は何ですか? Scala 2.10.2 の Option に三項演算子が見つかりません最後のジェネレーターは、更新されたキャッシュ (ヒットまたはミスがインクリメントされたもの) を
State
checkCache メソッドの結果にどのように戻しますか? 返さ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 として変換されていることを認識していることだと思います。Unit
s =>(s,ofs)
更新 オプションビットを今すぐ理解してください。状態モナドを導出しているにもかかわらず、プレゼンテーションはまだ Scalaz の暗黙を使用していると思います。