2015-10-20 12 views
6

Ecco il codice che utilizzate per lavorare (troncato in modo appropriato spero)Reactive Banana 1.0.0 - Perché questo vecchio codice si rompe?

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 

Ma ora i tipi sono cambiati.
abbiamo:
makeNetworkDescription :: Parameters -> MomentIO() e accumB :: MonadMoment m => a -> Event (a -> a) -> m (Behavior a)

dire che cambiare la definizione di bResourceMap per

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

leggermente fuori dalla definizione accumB, ma vediamo cosa succede.

ghc dà un errore

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

destro, a causa del tipo di accumB il comportamento deve essere nel contesto di un MonadMoment. Avere uno sguardo a MonadMoment trovo due istanze

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

Allora perché il tipo di volontà reale di Behavior (Behavior ResourceMap), il tipo di esterno deve essere un MonadMoment, che non corrisponde.

Vorrei ricevere consigli su come risolvere questo tipo di problema, succede con tutte le mie definizioni Behavior.

+0

solo curioso: è un progetto vero o un hobby? –

+0

È vero, ma non è un gioco qua qua. È un gioco che ha uno scopo diverso dal semplice gioco. –

risposta

5

Regolare il codice per adattarsi al nuovo tipo di accumB dovrebbe prendere solo utilizzando un vicolo cieco monade, piuttosto che un espressione let per definire bResourceMap:

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

L'errore di tipo lei cita sembra estraneo. La mia ipotesi sarebbe che initRmap è stato modificato per errore da ResourceMap a Behavior ResourceMap, causando la mancata corrispondenza del tipo.

+0

L'ho provato ma poi altri binding non rientrano nel campo di applicazione. Sto pensando che ho bisogno di aggiungere RecursiveDo per impedirlo. –

+1

@MichaelLitchard Effettivamente - le modifiche significano che avrete bisogno di 'MonadFix' /' RecursiveDo' in qualche forma per definizioni reciprocamente ricorsive che coinvolgono comportamenti definiti con 'acummB' /' stepper'. – duplode

+0

Per gli haskeller futuri: la chiave è usare mdo invece di farlo. Zucchero sintattico per rec e fix. –