2015-10-20 15 views
6

Oto kod, który używany do pracy (odpowiednio obcięte mam nadzieję)Reaktywny banan 1.0.0 - Dlaczego ten stary kod się psuje?

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 

Ale teraz typy uległy zmianie.
mamy:
makeNetworkDescription :: Parameters -> MomentIO() i accumB :: MonadMoment m => a -> Event (a -> a) -> m (Behavior a)

powiedzieć zmienić definicję bResourceMap do

bResourceMap :: Behavior ResourceMap 
bResourceMap = accumB initRmap $ 
       adjustMarket <$> 
       bMarketRolls <@ 
       eTick 

nieco off z definicji accumB, ale zobaczymy co się stanie.

ghc daje błąd

Couldn't match type ‘Behavior ResourceMap’ with ‘ResourceMap’ 
Expected type: Behavior ResourceMap 
    Actual type: Behavior (Behavior ResourceMap) 

rację, bo od rodzaju accumB zachowanie musi być w kontekście MonadMoment. Zaglądając do MonadMoment znajdę dwie instancje

instance MonadMoment Moment where liftMoment = id 
instance MonadMoment MomentIO where liftMoment = MIO . unM 

Więc dlaczego rzeczywistego typu postanowienie Behavior (Behavior ResourceMap), typ zewnętrzna musi być MonadMoment, który nie pasuje.

Proszę o poradę, jak rozwiązać ten problem, dzieje się tak z wszystkimi moimi definicjami Behavior.

+0

Po prostu ciekawy: czy to projekt prawdziwy czy hobby? –

+0

To jest prawdziwa, ale nie gra qua. Ta gra służy celowi innym niż byciu tylko grą. –

Odpowiedz

5

Regulacja swój kod, aby pasowały do ​​nowego typu accumB powinny podjąć tylko przy użyciu jednowartościowy wiążą zamiast wyrażenia let zdefiniować bResourceMap:

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

Błąd typu cytujesz wydaje niepowiązane. Domyślam się, że initRmap został przypadkowo zmieniony z ResourceMap na Behavior ResourceMap, prowadząc do niezgodności typu.

+0

Próbowałem już tego, ale wtedy inne wiązania wypadły poza zakres. Myślę, że muszę dodać RecursiveDo, aby temu zapobiec. –

+1

@MichaelLitchard Rzeczywiście - zmiany oznaczają, że będziesz potrzebował 'MonadFix' /' RecursiveDo' w jakiejś formie dla wzajemnie rekurencyjnych definicji obejmujących zachowania zdefiniowane przez 'acummB' /' stepper'. – duplode

+0

Dla przyszłych iskrowników - kluczem jest użycie mdo zamiast zrobić. Cukier syntaktyczny do rec i fix. –

Powiązane problemy