【发布时间】:2016-01-19 05:50:04
【问题描述】:
这是过去可以工作的代码(我希望适当截断)
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 定义都会发生这种问题。
【问题讨论】:
-
只是好奇:这是一个真实的项目还是爱好项目?
-
这是真的,但不是游戏。这是一款服务于其他目的的游戏,而不仅仅是一款游戏。
标签: haskell frp reactive-banana