我已經第一次使用cats來解決代碼的出現day 1,我想知道是否有可能改進的東西。如何使用貓和狀態Monad
給定一個方法update
具有以下簽名 def update(i: Instruction): PosAndDir => PosAndDir
我想出:
val state: State[PosAndDir, List[Unit]] = instructions.map(i => State.modify(update(i))).toList.sequenceU
val finalState = state.runS(PosAndDir(Pos(0, 0), North)).value
而且還
def update2(i: Instruction): State[PosAndDir, Option[Pos]] =
State.modify(update(i)).inspect(pad => if (i == Walk) Some(pad.pos) else None)
…
val state = instructions.map(update2).toList.sequenceU
val positions = state.runA(PosAndDir(Pos(0, 0), North)).value.flatten
更準確地說,問題是:
- 爲什麼我們需要撥打
.value
(與斯卡拉,它是透明的)? - 有沒有辦法寫
update2
用於理解提高可讀性? - 是否有
Applicative
實例爲Seq
在貓(我知道有沒有scalaz)。 ? - 任何想法改善代碼?
你能提供PosAndDir','Pos'和'Dir' – Odomontois
肯定'定義。完整的代碼在這裏:https://gist.github.com/YannMoisan/18e44d8998d42d745a3ea9caaae4c16a –