gpt4 book ai didi

haskell - Reactive Banana 1.0.0 - 为什么这个旧代码会被破坏?

转载 作者:行者123 更新时间:2023-12-02 15:25:39 25 4
gpt4 key购买 nike

这是曾经可以工作的代码(我希望适本地截断)

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 -> 事件 (a -> a) -> m (行为 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,这不匹配。

我想要有关如何解决此类问题的建议,我的所有行为定义都会发生这种情况。

最佳答案

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

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

您引用的类型错误似乎无关。我的猜测是 initRmap 被意外地从 ResourceMap 更改为 Behavior ResourceMap,导致类型不匹配。

关于haskell - Reactive Banana 1.0.0 - 为什么这个旧代码会被破坏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33238862/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com