这里的代码曾经工作过(我希望适当地截断)
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)
说我将bResourceMap
的定义更改为
bResourceMap :: Behavior ResourceMap
bResourceMap = accumB initRmap $
adjustMarket <$>
bMarketRolls <@
eTick
略微偏离accumB
定义,但让我们看看会发生什么。
ghc
发出错误
Couldn't match type ‘Behavior ResourceMap’ with ‘ResourceMap’
Expected type: Behavior ResourceMap
Actual type: Behavior (Behavior ResourceMap)
是的,由于accumB
的类型,行为需要在MonadMoment
的上下文中。看一下MonadMoment
我发现了两个实例
instance MonadMoment Moment where liftMoment = id
instance MonadMoment MomentIO where liftMoment = MIO . unM
那么为什么实际类型解析为Behavior (Behavior ResourceMap)
,外部类型必须是MonadMoment
,它不匹配。
我喜欢有关如何解决此类问题的建议,它适用于我的所有Behavior
定义。
答案 0 :(得分:5)
调整代码以适应新类型的accumB
应该只使用monadic绑定而不是let
表达式来定义bResourceMap
:
bResourceMap <- accumB initRmap (adjustMarket <$> bMarketRolls <@ eTick)
您引用的类型错误似乎无关。我的猜测是initRmap
被意外从ResourceMap
更改为Behavior ResourceMap
,导致类型不匹配。