次のエラーが表示されます。
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
. 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
バインディングがそこに長く留まることを望みません。私の期待は、ブレークアウトプロジェクトを再訪することで、コードをより適切に構造化する方法が示されることです。