Я использовал 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
у кошек (я знаю, что нет в скалясе). ? - любая идея улучшить код?
Не могли бы вы дать определения 'PosAndDir',' 'Pos' и Dir' – Odomontois
Sure. Полный код находится здесь: https://gist.github.com/YannMoisan/18e44d8998d42d745a3ea9caaae4c16a –