Генрих Апфельмус щедро поддержал эта проблема. Я рассматривал возможность использования accumB
в качестве решения, но думал, что будет ошибка типа. В любом случае, попробовав его предложение, я получил ошибку типа.
let bGameState :: Behavior t GameState
bGameState = accumB initialGS $ updateGS <$ eInput
yields the error
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'
Итак, я изучил (<$)
и возился с частичным применением. Посмотрел предложенные им примеры. Чем больше я это делал, тем больше я думал, что приведенный выше код должен работать, и я был сбит с толку, почему это не так.
Вот что я думаю должно происходить:
так как (<$)
имеет тип (<$) :: a -> f b -> f a
а updateGS имеет тип updateGS :: PlayerCommand -> GameState -> GameState
а eInput
относится к типу Event t PlayerCommand
то не должен updateGS <$ eInput
уступать
Event t (GameState -> GameState)
?
Мои рассуждения где-то ошибочны, может кто-нибудь указать где?
Обновление: когда я попытался использовать (<$>)
, я получил следующую ошибку
план.hs:158:21:
Could not deduce (t ~ t1)
from the context (Frameworks t)
bound by a type expected by the context:
Frameworks t => Moment t ()
at outline.hs:(153,42)-(159,93)
`t' is a rigid type variable bound by
a type expected by the context: Frameworks t => Moment t ()
at outline.hs:153:42
`t1' is a rigid type variable bound by
the type signature for bGameState :: Behavior t1 GameState
at outline.hs:158:8
Expected type: Behavior t1 GameState
Actual type: Behavior t GameState
In the expression: accumB initialGS $ updateGS <$> eInput
In an equation for `bGameState':
bGameState = accumB initialGS $ updateGS <$> eInput
для справки, вот вся функция
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 = accumB initialGS $ updateGS <$> eInput
reactimate $ (\n -> appendFile "output.txt" ("Command is " ++ show n)) <$>
eCommandChanged
bGameState
— она слишком полиморфна (наt
есть неявнаяforall
). - person hammar   schedule 25.10.2012