2015-10-20 12 views
6

Вот код, который используется для работы (обрезаются соответствующим образом я надеюсь)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.

+0

просто любопытно: это настоящий или хобби проект? –

+0

Это настоящая игра, но не игра qua. Это игра, цель которой - не просто игра. –

ответ

5

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

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

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

+0

Я пробовал это, но тогда другие привязки выпадают из сферы действия. Я думаю, мне нужно добавить RecursiveDo, чтобы этого не случилось. –

+1

@MichaelLitchard Действительно - изменения означают, что вам понадобится 'MonadFix' /' RecursiveDo' в той или иной форме для взаимно-рекурсивных определений, включающих поведение, определенное с помощью 'acummB' /' stepper'. – duplode

+0

Для будущих haskellers - ключ должен использовать mdo вместо do. Синтаксический сахар для rec и исправления. –