【发布时间】:2017-05-15 09:58:36
【问题描述】:
我第一次使用cats 来解决代码出现的day 1,我想知道是否有可能改进。
给定一个具有以下签名的方法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(使用scalaz,它是透明的)? - 有没有办法写
update2以提高可读性? - 猫中有
Seq的Applicative实例(我知道scalaz 中没有)。 ? - 有改进代码的想法吗?
【问题讨论】:
-
您能否提供
PosAndDir、Pos和Dir的定义
标签: scala functional-programming scala-cats