Reactive Banana 1.0.0 - 为什么这个旧代码破坏了?

Mic*_*ard 6 haskell frp reactive-banana

这是以前的代码(我希望适当截断)

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
Run Code Online (Sandbox Code Playgroud)

但现在类型已经改变了.
我们有:
makeNetworkDescription :: Parameters -> MomentIO ()accumB :: MonadMoment m => a -> Event (a -> a) -> m (Behavior a)

说我改变的定义bResourceMap

bResourceMap :: Behavior ResourceMap
bResourceMap = accumB initRmap $
               adjustMarket   <$>
               bMarketRolls   <@
               eTick
Run Code Online (Sandbox Code Playgroud)

略微偏离accumB定义,但让我们看看会发生什么.

ghc 给出错误

Couldn't match type ‘Behavior ResourceMap’ with ‘ResourceMap’
Expected type: Behavior ResourceMap
  Actual type: Behavior (Behavior ResourceMap)
Run Code Online (Sandbox Code Playgroud)

是的,因为accumB行为的类型需要在一个上下文中MonadMoment.看看MonadMoment我找到两个实例

instance MonadMoment Moment where liftMoment = id
instance MonadMoment MomentIO where liftMoment = MIO . unM
Run Code Online (Sandbox Code Playgroud)

那么为什么实际类型解析为Behavior (Behavior ResourceMap),外部类型必须是a MonadMoment,它不匹配.

我想了解如何解决这类问题的建议,它适用于我的所有Behavior定义.

dup*_*ode 5

调整代码以适应新类型accumB应该只使用monadic绑定而不是let表达式来定义bResourceMap:

bResourceMap <- accumB initRmap (adjustMarket <$> bMarketRolls <@ eTick)
Run Code Online (Sandbox Code Playgroud)

您引用的类型错误似乎无关.我的猜测initRmap是偶然从a ResourceMap变为a Behavior ResourceMap,导致类型不匹配.