【发布时间】:2013-10-08 09:42:28
【问题描述】:
我正在学习 Michael Pilquist 的优秀状态单子讲座here。我在 54 分钟时遇到了两个问题。
如果
ofs是Option[FollowerStats],那么?运算符是什么?一世 在 Scala 2.10.2 中的 Option 上找不到三元运算符最后一个生成器如何将更新的缓存(命中或未命中递增)放回 checkCache 方法的
State结果中?返回的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 本质上是在说:从put 中取出最后一个状态s => (s,()) 并将Unit 值类型替换为ofs,得到s =>(s,ofs)。我想关键是要意识到 yield 并不是字面上的返回 ofs,而是被翻译为 State.map。
更新 现在了解选项位。我猜这个演示文稿仍然使用了 Scalaz 的隐式,尽管它派生了 state monad。
【问题讨论】:
-
Option ? ... | ...位来自隐式转换(特别是隐式类OptionOps)。您可能已经处理过隐式转换,例如由于隐式转换为StringOps而能够在字符串上调用toInt- 这几乎相同。 -
在 1:06:12 他实际上提到了选项的事情。应该继续观看,但强迫症阻止了它。
-
希望下一个观看该视频的强迫症患者会发现这个问题,阅读所有的 cmets,并知道直接跳回去观看视频的其余部分! :)
标签: scala monads scalaz state-monad