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定义.
调整代码以适应新类型accumB应该只使用monadic绑定而不是let表达式来定义bResourceMap:
bResourceMap <- accumB initRmap (adjustMarket <$> bMarketRolls <@ eTick)
Run Code Online (Sandbox Code Playgroud)
您引用的类型错误似乎无关.我的猜测initRmap是偶然从a ResourceMap变为a Behavior ResourceMap,导致类型不匹配.