Tôi có mã sau đây. Tôi muốn có thể thay đổi cuộc sống của người chơi đang hoạt động khi đưa ra trạng thái trò chơi. Tôi đã đưa ra một ống kính activePlayer
, nhưng khi tôi cố gắng và sử dụng nó kết hợp với -=
điều hành tôi nhận được lỗi sau:Haskell - Ống kính, sử dụng chức năng 'to'
> 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``
và mã trong câu hỏi:
{-# 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)
Mỗi người chơi mất đến lượt họ. Tôi cần phải theo dõi tất cả các cầu thủ cùng một lúc cũng như hiện đang hoạt động, đó là lý do tôi cấu trúc như thế nào, mặc dù tôi mở ra các cấu trúc khác nhau vì tôi có thể chưa có cấu trúc phù hợp.
Tôi nghĩ rằng vấn đề của bạn là định nghĩa 'activePlayer' cho phép nó hoạt động như một trình thu thập, nhưng không phải là người đặt cược - bạn đã nói với nó cách kéo một người chơi ra khỏi chuỗi, nhưng không phải cách thay đổi người chơi hoạt động - do đó nó không thể được sử dụng để sửa đổi người chơi. Kiểm tra kiểu 'to' ---'>: i to' kết quả trong 'to :: (a -> c) -> Getter a b c d' –