2015-10-20 2 views
6

Hier ist Code, der zur Arbeit verwendet (abgeschnitten angemessen Ich hoffe)Reactive Banana 1.0.0 - Warum bricht dieser alte Code?

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 

Aber jetzt sind die Typen geändert haben.
haben wir:
makeNetworkDescription :: Parameters -> MomentIO() und accumB :: MonadMoment m => a -> Event (a -> a) -> m (Behavior a)

sagen, dass ich die Definition von bResourceMap zu

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

etwas weg von der accumB Definition zu ändern, aber mal sehen, was passiert.

ghc gibt einen Fehler

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

Rechts, wegen der Art der accumB das Verhalten im Rahmen eines MonadMoment sein muss. So mit einem Blick auf MonadMoment finde ich zwei Instanzen

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

warum Behavior (Behavior ResourceMap) den tatsächlichen Typ Entschlossenheit hat, der äußere Typ hat eine MonadMoment sein, die nicht übereinstimmt.

Ich hätte gerne Ratschläge zur Lösung dieser Art von Problem, es passiert mit allen meinen Behavior Definitionen.

+0

nur neugierig: Ist das ein echtes oder Hobby-Projekt? –

+0

Es ist echt, aber kein Spiel als Spiel. Es ist ein Spiel, das einen anderen Zweck erfüllt als nur ein Spiel zu sein. –

Antwort

5

Einstellen der Code den neuen Typ von accumB passen sollte nur eher eine monadische binden nehmen mit als ein let Ausdruck bResourceMap zu definieren:

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

Die Art Fehler, den Sie in keinem Zusammenhang zitieren scheint. Meine Vermutung wäre, dass initRmap versehentlich von einem ResourceMap zu einem Behavior ResourceMap geändert wurde, was zu dem Typ Mismatch führte.

+0

Ich habe das versucht, aber dann fallen andere Bindungen aus dem Rahmen. Ich denke, dass ich RecursiveDo hinzufügen muss, um das zu verhindern. –

+1

@MichaelLitchard Tatsächlich - die Änderungen bedeuten, dass Sie 'MonadFix' /' RecursiveDo' in irgendeiner Form für wechselseitig rekursive Definitionen benötigen, die mit 'acummB' /' stepper' definierte Verhaltensweisen beinhalten. – duplode

+0

Für zukünftige haskeller - der Schlüssel ist, mdo statt zu tun. Syntaktischer Zucker für rec und fix. –

Verwandte Themen