Ich habe den folgenden Code. Ich würde gerne in der Lage sein, das Leben des aktiven Spielers zu verändern, wenn ihm ein Spielstatus zugewiesen wird. Ich kam mit einem activePlayer
Objektiv, aber wenn ich versuche, und verwenden Sie es in Kombination mit dem -=
Operator ich die folgende Fehlermeldung:Haskell - Linsen, Verwendung von 'zu' Funktion
> over (activePlayer.life) (+1) initialState
<interactive>:2:7:
No instance for (Contravariant Mutator)
arising from a use of `activePlayer'
Possible fix:
add an instance declaration for (Contravariant Mutator)
In the first argument of `(.)', namely `activePlayer'
In the first argument of `over', namely `(activePlayer . life)'
In the expression: over (activePlayer . life) (+ 1) initialState``
und den Code in Frage:
{-# LANGUAGE TemplateHaskell #-}
module Scratch where
import Control.Lens
import Control.Monad.Trans.Class
import Control.Monad.Trans.State
import Data.Sequence (Seq)
import qualified Data.Sequence as S
data Game = Game
{ _players :: (Int, Seq Player) -- active player, list of players
, _winners :: Seq Player
}
deriving (Show)
initialState = Game
{ _players = (0, S.fromList [player1, player2])
, _winners = S.empty
}
data Player = Player
{ _life :: Integer
}
deriving (Show, Eq)
player1 = Player
{ _life = 10
}
player2 = Player
{ _life = 10
}
makeLenses ''Game
makeLenses ''Player
activePlayer
:: (Functor f, Contravariant f) =>
(Player -> f Player) -> Game -> f Game
activePlayer = players.to (\(i, ps) -> S.index ps i)
Jeder Spieler nimmt sie sind an der Reihe. Ich muss den Überblick über alle Spieler auf einmal behalten und auch, was gerade aktiv ist. Aus diesem Grund habe ich das strukturiert, obwohl ich offen für verschiedene Strukturen bin, da ich wahrscheinlich noch nicht die richtige habe.
Ich denke, dein Problem ist, dass die Definition von 'activePlayer 'es erlaubt, als Getter zu fungieren, aber nicht als Setter - du hast ihm gesagt, wie man einen Spieler aus der Sequence zieht, aber nicht wie man das ändert aktiver Spieler - daher kann er nicht zum Ändern von Spielern verwendet werden. Schau dir die Art von 'to' ---'> an: i to' ergibt 'to :: (a -> c) -> Getter a b c d' –