我收到以下错误:
Libraries/Reactive/GameMechanic.hs:34:80:
No instance for (Apply (Behavior t0) (Event t))
arising from a use of `<@'
Possible fix:
add an instance declaration for (Apply (Behavior t0) (Event t))
In the second argument of `($)', namely
`(updateAgentMap <$> bHyperMap <*> bPlanetMap) <@ eTick'
In the expression:
accumB initialAMap
$ (updateAgentMap <$> bHyperMap <*> bPlanetMap) <@ eTick
In an equation for `bAgentMap':
bAgentMap
= accumB initialAMap
$ (updateAgentMap <$> bHyperMap <*> bPlanetMap) <@ eTick
t0
中的Event
和t1
中的Behavior
是我的问题的线索,但我不知道如何解释这个线索。因此,让我们从一些类型开始,错误的代码和我的理由为什么它应该工作。
bAgentMap :: Behavior t AgentMap
bAgentMap = accumB initialAMap $ (updateAgentMap <$> bHyperMap <*> bPlanetMap) <@ eTick
initialAMap :: AgentMap
updateAgentMap :: HyperMap -> PlanetMap -> AgentMap -> AgentMap
bHyperMap :: Behavior t HyperMap
bPlanetMap :: Behavior t PlanetMap
accumB :: a -> Event t (a -> a) -> Behavior t a
所以我得到了第一个参数AgentMap
。第二个需要Event t (AgentMap -> AgentMap)
。到那里怎么走?如果我以updateAgentMap <$> bHyperMap
开头,则类型应为Behavior t (PlanetMap -> AgentMap -> AgentMap)
。好了,还有一个参数updateAgentMap <$> bHyperMap <*> bPlanetMap
为我们提供了类型Behavior t (AgentMap -> AgentMap)
。差不多吧?
鉴于此
(<@) :: f a -> g b -> g a
和
eTick :: Event t ()
并用a
代替(AgentMap -> AgentMap)
我应该能够做到这一点
(updateAgentMap <$> bHyperMap <*> bPlanetMap)
&lt; @ eTick
获取Event t (AgentMap -> AgentMap)
但不是那么快。我的推理必定在某处失败。有人能告诉我在哪里吗?
更新:事实证明发生了这个问题,因为未定义eTick(我认为)。我试图将大部分代码分离到它自己的file中。我知道离开eTick undefined
会不会令人满意,但我还没有弄清楚我想对此做些什么。所以在此期间我开始将代码转换为let绑定,就像我原来的那样。现在我的代码编译。我不希望let
绑定在那里停留很长时间。我的期望是重新访问breakout项目将向我展示如何更好地构建我的代码。