功能性香蕉旅行者 - 破碎型神秘

时间:2013-06-15 19:30:49

标签: haskell frp reactive-banana

我收到以下错误:

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中的Eventt1中的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 aeTick :: Event t ()

并用a代替(AgentMap -> AgentMap) 我应该能够做到这一点 (updateAgentMap <$> bHyperMap <*> bPlanetMap)&lt; @ eTick

获取Event t (AgentMap -> AgentMap)

但不是那么快。我的推理必定在某处失败。有人能告诉我在哪里吗?

更新:事实证明发生了这个问题,因为未定义eTick(我认为)。我试图将大部分代码分离到它自己的file中。我知道离开eTick undefined会不会令人满意,但我还没有弄清楚我想对此做些什么。所以在此期间我开始将代码转换为let绑定,就像我原来的那样。现在我的代码编译。我不希望let绑定在那里停留很长时间。我的期望是重新访问breakout项目将向我展示如何更好地构建我的代码。

0 个答案:

没有答案
相关问题