我收到以下错误:
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
in the和Event
the t1
in theBehavior
是我对这个问题的线索,但我不知道如何解释这个线索。所以让我们从一些类型开始,错误的代码和我对它为什么应该工作的推理。
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
给我们一个 type Behavior t (AgentMap -> AgentMap)
。快到了吧?
鉴于此
(<@) :: f a -> g b -> g a
和
eTick :: Event t ()
并代替a
我(AgentMap -> AgentMap)
应该能够做到这一点
(updateAgentMap <$> bHyperMap <*> bPlanetMap)
<@ eTick
要得到Event t (AgentMap -> AgentMap)
但没那么快。我的推理一定在某个地方失败了。谁能告诉我在哪里?
更新:原来这个问题的发生是因为 eTick 没有定义(我认为)。我曾试图将大部分代码分离到它自己的文件中。我知道离开 eTickundefined
不会令人满意,但我还没有弄清楚我想对此做些什么。因此,与此同时,我开始将代码移动到最初的let绑定中。现在我的代码编译了。我不希望let
绑定在那里停留太久。我的期望是重新审视这个突破性项目将告诉我如何更好地构建我的代码。