問題は、タイプの動作を作成する方法がわからないことですBehavior t GameState
私はもっと多くのコードを持っていますが、問題について話すために必要だと思うものを表示しようとしています. 記入すべき空白があるかどうか教えてください。私が持っているものは次のとおりです。
data GameState = GameState {agent :: Agent
,universe :: Universe
}
type Universe = Gr Planet ()
data Command = Move PlanetName
| Look
| Quit
deriving Show
data PlayerCommand = PlayerCommand Command PID
| Null
deriving Show
updateGS :: PlayerCommand -> GameState -> GameState
updateGS (PlayerCommand (Move planet) pid) gs =
let agent = getAgent pid gs
nodes = labNodes $ universe gs
current = location agent
Just fromP = lookup (fromEnum current) nodes
Just toP = lookup (fromEnum planet) nodes
fromNode = fromEnum current
toNode = fromEnum planet
uPlayer = Player pid (getPlanetName toP) (Location planet)
mData = MoveData uPlayer (toNode,toP) (fromNode,fromP) nodes
uPlanets = updateLNodeList mData
in GameState uPlayer (mkGraph uPlanets $ labUEdges gates
initialGS :: GameState
initialGS = GameState initPlayer (makeUniverse makePlanetNodes)
そしてイベントネットワーク
makeNetworkDescription :: AddHandler PlayerCommand -> IO EventNetwork
makeNetworkDescription addCommandEvent = compile $ do
eInput <- fromAddHandler addCommandEvent
let bCommand = stepper Null eInput
eCommandChanged <- changes bCommand
let bGameState :: Behavior t GameState
bGameState = stepper initialGS
reactimate $ (\n -> appendFile "output.txt" ("Command is " ++ show n)) <$> eCommandChanged
bGameState は eCommandChange を使用する必要があると思いますが、型に問題があります
stepper :: a -> Event t a -> Behavior t a
これにより、に変換eInput :: Event t PlayerCommand
する
必要があると信じるようになります。eGameState :: Event t GameState
stepper
Behavior t GameState
それで、私の質問は、私の考え方は正しいですか? そうでない場合は、リダイレクトできますか? もしそうなら、どのようにeGameState :: Event t GameState
見えますか?
以下、回答者様へのお返事です。最初に考えたときaccumB
、作成中に型エラーが発生しました。私があなたの提案を試したときに何が起こったのですか。
let bGameState :: Behavior t GameState
bGameState = accumB initialGS $ updateGS <$ eInput
エラーが発生します
Couldn't match expected type `GameState'
with actual type `PlayerCommand'
Expected type: GameState -> GameState
Actual type: PlayerCommand -> GameState -> GameState
In the first argument of `(<$)', namely `updateGS'
In the second argument of `($)', namely `updateGS <$ eInput'
それについて何をすべきかわからない。あなたの例を見て、答えが明確になるかどうかを確認します。accumB
私が集中していたので、指摘してくれてありがとうstepper
提案されたコードを研究すればするほど、型エラーに戸惑います。