Вот код, который работал (надеюсь, усечен соответствующим образом)
makeNetworkDescription :: forall t . Frameworks t => Parameters -> Moment t ()
makeNetworkDescription params = do
eInput <- fromAddHandler (input params)
eTick <- fromAddHandler (tick params)
..
let
bResourceMap :: Behavior t ResourceMap
bResourceMap = accumB initRmap $
adjustMarket <$>
bMarketRolls <@
eTick
Но теперь типы изменились.
у нас есть:makeNetworkDescription :: Parameters -> MomentIO ()
и accumB :: MonadMoment m => a -> Event (a -> a) -> m (Behavior a)
скажем, я меняю определение bResourceMap
на
bResourceMap :: Behavior ResourceMap
bResourceMap = accumB initRmap $
adjustMarket <$>
bMarketRolls <@
eTick
немного отличается от определения accumB
, но посмотрим, что получится.
ghc
выдает ошибку
Couldn't match type ‘Behavior ResourceMap’ with ‘ResourceMap’
Expected type: Behavior ResourceMap
Actual type: Behavior (Behavior ResourceMap)
Правильно, из-за типа accumB
поведение должно быть в контексте MonadMoment
. Взглянув на MonadMoment
, я нахожу два экземпляра
instance MonadMoment Moment where liftMoment = id
instance MonadMoment MomentIO where liftMoment = MIO . unM
Так почему же фактический тип разрешается в Behavior (Behavior ResourceMap)
, внешний тип должен быть MonadMoment
, что не соответствует.
Мне нужен совет, как решить проблему такого типа, это происходит со всеми моими Behavior
определениями.