Reactive Banana 1.0.0 — Почему этот старый код ломается?

Вот код, который работал (надеюсь, усечен соответствующим образом)

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 определениями.


person Michael Litchard    schedule 20.10.2015    source источник
comment
просто интересно: это реальный проект или хобби?   -  person Erik Kaplun    schedule 21.10.2015
comment
Это реально, но не игра как игра. Это игра, которая служит цели, отличной от того, чтобы быть просто игрой.   -  person Michael Litchard    schedule 21.10.2015


Ответы (1)


Настройка вашего кода в соответствии с новым типом accumB должна включать использование монадической привязки, а не выражения let для определения bResourceMap:

bResourceMap <- accumB initRmap (adjustMarket <$> bMarketRolls <@ eTick)

Ошибка типа, которую вы цитируете, кажется несвязанной. Я предполагаю, что initRmap был случайно изменен с ResourceMap на Behavior ResourceMap, что привело к несоответствию типа.

person duplode    schedule 20.10.2015
comment
Я пробовал это, но тогда другие привязки выпадают из области видимости. Я думаю, мне нужно добавить RecursiveDo, чтобы предотвратить это. - person Michael Litchard; 20.10.2015
comment
@MichaelLitchard Действительно - изменения означают, что вам понадобится MonadFix/RecursiveDo в той или иной форме для взаимно рекурсивных определений, включающих поведение, определенное с помощью acummB/stepper. - person duplode; 20.10.2015
comment
Для будущих хаскеллеров ключ в том, чтобы использовать mdo вместо do. Синтаксический сахар для записи и исправления. - person Michael Litchard; 21.10.2015