我在这里学习迈克尔·皮尔奎斯特(Michael Pilquist)的优秀状态单子讲座。我在 54 分钟时遇到了两个问题。
如果
ofs
是Option[FollowerStats]
,那么?
运算符是什么?我在 Scala 2.10.2 中的 Option 上找不到三元运算符最后一个生成器如何将更新的缓存(增加命中或未命中)放回
State
checkCache 方法的结果中?返回的State
似乎被丢弃了,而 for 理解似乎只产生了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
为了尝试理解,我尝试重新编写 for理解,但这没有帮助。
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,())
并用 ofsput
替换Unit
值类型,以获取s =>(s,ofs)
. 我想关键是要意识到收益并不是字面上的返回,而是被翻译为 State.map。
更新 现在了解选项位。我猜这个演示文稿仍然使用了 Scalaz 的隐式,尽管它派生了 state monad。