मेरे पास निम्न कोड है। जब मैं गेम स्टेटस देता हूं तो मैं सक्रिय खिलाड़ी के जीवन को संशोधित करने में सक्षम होना चाहता हूं। मैं एक activePlayer
लेंस के साथ आया था, लेकिन जब मैं कोशिश करते हैं और -=
ऑपरेटर मैं निम्न त्रुटि प्राप्त के साथ संयोजन में इसका इस्तेमाल करते हैं:हास्केल - लेंस, 'टू' फ़ंक्शन का उपयोग
> 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``
और प्रश्न में कोड:
{-# 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)
प्रत्येक खिलाड़ी ले जाता है क्रम में उनकी बारी। मुझे एक ही समय में सभी खिलाड़ियों का ट्रैक रखने की आवश्यकता है, साथ ही वर्तमान में सक्रिय है, यही कारण है कि मैंने इसे कैसे संरचित किया, हालांकि मैं अलग-अलग संरचनाओं के लिए खुला हूं क्योंकि मेरे पास अभी तक सही नहीं है।
मुझे लगता है कि आपकी समस्या यह है कि 'सक्रियप्लेयर' की परिभाषा इसे गेटर के रूप में कार्य करने की अनुमति देती है, लेकिन एक सेटटर के रूप में नहीं - आपने यह बताया है कि अनुक्रम के बाहर किसी खिलाड़ी को कैसे खींचें, लेकिन कैसे नहीं बदला जाए सक्रिय खिलाड़ी - इसलिए इसका उपयोग खिलाड़ियों को संशोधित करने के लिए नहीं किया जा सकता है। 'To' के प्रकार की जांच करें-'>: i to 'में परिणाम' to :: (a -> c) -> गेटटर ए बी सी डी –