Po raz pierwszy użyłem cats do rozwiązania day 1 nadejścia kodu i zastanawiam się, czy można coś poprawić.Jak używać kotów i Monady stanu
Biorąc pod uwagę metodę update
z następującym podpisem def update(i: Instruction): PosAndDir => PosAndDir
mam wymyślić:
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
a także
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
Dokładniej pytania:
- dlaczego potrzebujemy zadzwonić pod numer
.value
(z scalazem, jest przezroczysty)? - Czy istnieje sposób, aby napisać
update2
ze zrozumieniem w celu poprawy czytelności? - jest instancja
Applicative
dlaSeq
dla kotów (wiem, że nie ma w niej skalaza). ? - jakikolwiek pomysł ulepszenia kodu?
można podać definicje '' Pos' PosAndDir' i 'Dir' – Odomontois
pewien. Pełny kod jest tutaj: https://gist.github.com/YannMoisan/18e44d8998d42d745a3ea9caaae4c16a –