1

次のエラーが表示されます。

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

t0Eventt1Behavior問題の手がかりですが、この手がかりをどのように解釈すればよいかわかりません。それでは、いくつかのタイプ、誤ったコード、およびそれが機能する理由についての私の推論から始めましょう。

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. 2 つ目は である必要がありますEvent t (AgentMap -> AgentMap)。そこに着く方法?から始めるとupdateAgentMap <$> bHyperMap、タイプは になりますBehavior t (PlanetMap -> AgentMap -> AgentMap)。さて、もう 1 つのパラメータupdateAgentMap <$> bHyperMap <*> bPlanetMapで type を指定しますBehavior t (AgentMap -> AgentMap)。もうすぐですよね?

これを考える (<@) :: f a -> g b -> g a と、 eTick :: Event t ()

Iの代わりa(AgentMap -> AgentMap) これを行うことができるはずです (updateAgentMap <$> bHyperMap <*> bPlanetMap)<@ eTick

取得するためEvent t (AgentMap -> AgentMap)

しかし、それほど速くはありません。私の推論はどこかで失敗しているに違いありません。誰か教えてくれませんか?

更新: eTick が定義されていなかったために、この問題が発生したことが判明しました (と思います)。コードの多くを独自のファイルに分離しようとしました。eTick を離れるundefinedことは満足のいくものではないことはわかっていましたが、これについて何をしたいのかまだ考えていません。そのため、その間、コードを元のようにletバインディングに移動し始めました。これでコードがコンパイルされます。letバインディングがそこに長く留まることを望みません。私の期待は、ブレークアウトプロジェクトを再訪することで、コードをより適切に構造化する方法が示されることです。

4

0 に答える 0