2015-10-20 10 views
6

はここで働いていたコード(私は願って適切に切り捨て)リアクティブバナナ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)

は、私は少しaccumB定義から外れ

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

bResourceMapの定義を変更すると言うが、のは、何が起こるか見てみましょう。

ghcがあるため動作がMonadMomentのコンテキスト内であることが必要accumBのタイプのエラー

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

権利が与えられます。 Behavior (Behavior ResourceMap)に実際の型決意をした理由は、私は2つのインスタンス

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

を見つけるMonadMoment見を持つことは、だから、外型が一致しないMonadMoment、なければなりません。

私はこのタイプの問題を解決する方法についてアドバイスをしたいと思います。すべての私のBehavior定義で起こります。 accumBの新しいタイプに合わせてコードを調整

+0

ちょうど興味深い:これは本当ですか、それとも趣味のプロジェクトですか? –

+0

これは実際のゲームクアゲームではありません。単なるゲームではなく目的を果たすゲームです。 –

答えて

5

だけbResourceMapを定義するためにモナドバインドではなくlet式を使用して取る必要があります。

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

あなたが引用タイプのエラーは無関係と思われます。私の推測では、initRmapResourceMapからBehavior ResourceMapに誤って変更され、タイプの不一致が発生することになります。

+0

私はそれを試みましたが、他のバインディングが範囲外になりました。私はそれを防ぐためにRecursiveDoを追加する必要があると思っています。 –

+1

@MichaelLitchard実際、 'acummB' /' stepper'で定義された振る舞いを含む相互に再帰的な定義のために、 'MonadFix' /' RecursiveDo'が何らかの形で必要であることを意味します。 – duplode

+0

将来のハズケラーにとって、キーはdoの代わりにmdoを使うことです。 recとfixのための構文的砂糖。 –