reduzieren Ich habe meinen Code für day 12 der Einführung des Codes mit monocle, eine Linsenbibliothek in scala refaktoriert.Wie man Boilerplate mit Monokel in scala
Ist es möglich, diesen Code zu verbessern:
type Register = String
type Mem = Map[String, Int]
@Lenses
case class State(mem: Mem, pointer: Int)
def processInstruction(instructions: Seq[Instruction]): State => State = { s =>
(instructions(s.pointer) match {
case Inc(r) =>
State.pointer.modify(_ + 1) andThen (State.mem composeLens at(r)).modify(_.map(_ + 1))
case Dec(r) =>
State.pointer.modify(_ + 1) andThen (State.mem composeLens at(r)).modify(_.map(_ - 1))
case CpyInt(v, to) =>
State.pointer.modify(_ + 1) andThen (State.mem composeLens at(to)).set(Some(v))
case CpyReg(from, to) =>
State.pointer.modify(_ + 1) andThen (State.mem composeLens at(to)).set(Some(s.mem(from)))
case Jnz(r, v) => if (r != "1" && s.mem(r) == 0)
State.pointer.modify(_ + 1)
else
State.pointer.modify(_ + v)
}).apply(s)
}
Und hier ist noch einmal zu versuchen, die Änderung der einzelnen Felder zu trennen
def processInstruction2(instructions: Seq[Instruction]): State => State = { s =>
val ptr = instructions(s.pointer) match {
case Jnz(r, v) if !(r != "1" && s.mem(r) == 0) => State.pointer.modify(_ + v)
case _ => State.pointer.modify(_ + 1)
}
val mem = instructions(s.pointer) match {
case Inc(r) => (State.mem composeLens at(r)).modify(_.map(_ + 1))
case Dec(r) => (State.mem composeLens at(r)).modify(_.map(_ - 1))
case CpyInt(v, to) => (State.mem composeLens at(to)).set(Some(v))
case CpyReg(from, to) => (State.mem composeLens at(to)).set(Some(s.mem(from)))
case _ => identity[State]
}
(ptr andThen mem)(s)
}
eine Frage: Gibt es eine Möglichkeit Map.withDefaultValue
zu verwenden, um mit Monokel?
Der vollständige Code ist hier: https://gist.github.com/YannMoisan/b8ba25afc041d88706545527d9ec1988
Ich würde 'index' stattdessen verwenden (Die letzte Zeile von
processInstruction3
sollte mit dem obigen Code ersetzt werden) von 'at', wenn Sie den Wert innerhalb der Karte ändern möchten, z '(State.mem composeOptional index (r)). Modify (_ + 1)' anstelle von '(State.mem composeLens at (r)). Modify (_. Map (_ + 1))' –