Lassen Sie uns ein Spiel spielen. Es gibt zwei Stapel, die wir verwenden werden, beide bestehen aus schwarzen/weißen Chips.Aktualisieren mehrerer Teilfelder eines Feldes mit Ekmett Lens
data Pile = Pile { _blacks, _whites :: Int }
makeLenses ''Pile
data Game = Game { _pileA, _pileB :: Pile }
makeLenses ''Game
Ein wirklich kluger Schachzug wäre einen schwarzen Chip im Stapel A zu übergeben, und einen weißen Chip - in Haufen B. Aber wie?
cleverMove :: Game -> Game
cleverMove game = game & pileA . blacks -~ 1
& pileA . whites +~ 1
& pileB . blacks +~ 1
& pileB . whites -~ 1
Nicht sehr elegant. Wie kann ich es tun, ohne jeden Stapel zweimal zu referenzieren?
Das einzige, was ich mit kam (und Ich mag es nicht wichtig):
cleverMove game = game & pileA %~ (blacks -~ 1)
. (whites +~ 1)
& pileB %~ (blacks +~ 1)
. (whites -~ 1)
(leider im Voraus, wenn es offensichtlich ist - ich bin irgendwie neu zu Linsen und ich fühle mich im Meer verloren von Kombinatoren und Operatoren lens
Angebote. es ist wahrscheinlich alles, was für Bedürfnisse der jeder dort versteckt. Nicht, dass es schlecht ist, natürlich ist! aber ich wünschte, es gehörte auch ein komplettes Handbuch war.)
Was gefällt Ihnen an Option 2 nicht? Es kann nicht viel prägnanter als das sein, oder? – leftaroundabout
@leftaroundabout Ich mag es nicht, dass ich Brackets benutzen musste, die zu plump werden, wenn mehrzeilige Ausdrücke involviert sind - wie Do-Blöcke und weitere Ebenen der Verschachtelung. – Artyom
Ich denke, es würde helfen, wenn Sie einen groben Pseudocode zeigen würden, der Ihrer idealen Syntax entspricht. –