反应性香蕉中的动态事件切换

Asg*_*gel 9 haskell frp reactive-banana

我目前正在开发一款利用活性香蕉和SDL的小游戏.由于目标主要是为了更多地了解反应性香蕉和FRP,我尝试使用动态切换来设置游戏对象的集合,但到目前为止还没有取得多大成功.

在Bartab示例中,我发现了唯一使用事件切换的示例,最终触发在集合中创建新条目的事件是从事件网络外部获取的,而不是使用内部事件.我的问题是:这是唯一的方法,还是这个例子的特例?

在活性香蕉中是否还有更多动态事件切换示例?

根据我的理解,我得到一个时刻t(Anytime Behavior a),使用execute创建一个事件t(Anytime Behavior a),然后用于更新携带集合的Behavior.使用trimB对从触发事件创建的行为创建时刻t(任意时间行为a).如果此触发事件源自事件网络,则不会使用错误消息"无法推断(t~t1)"进行编译.我不确定〜确切意味着什么,但它显然会抛出错误,因为事件网络的两个框架值(t)和这个新的Moment值是不同的.

所以,长话短说,我不明白反应香蕉中的事件切换是如何工作的,我不知道为什么.它在理论上应该相对简单.

编辑:

-- Event Network
-- ==========================
setupNetwork :: forall t. Frameworks t => (EventSource Command, EventSource ()) -> IORef SpriteMap -> GameMap -> Moment t ()
setupNetwork ((addHandlerE, _), (addHandlerT, _)) sprites map = do

        -- Input Events
        ----------------
        eInput <- fromAddHandler addHandlerE -- Player Commands
        eFrame <- fromAddHandler addHandlerT -- Event on each Frame

        let
            [...]


            eSpawnEvent :: Event t (DSCoord)
            eSpawnEvent = extractCoord <$> eLeftClick 
                where
                        extractCoord (LeftClick c) = c

            spawnPos :: Frameworks s => Moment s (AnyMoment Behavior DSCoord)
            spawnPos = trimB $ stepper (0,0) eSpawnEvent

        eSpawnPos <- execute $ (FrameworksMoment spawnPos <$ eSpawnEvent)
                [...]
Run Code Online (Sandbox Code Playgroud)

我只是尝试从示例中镜像newEntry/eNewEntry,只是使用普通事件来创建新行为.这会在spawnPos中产生"无法推断(t~s)"错误.

EDIT2:

它工作,但现在我使用执行创建事件的行上出现相同的错误."无法推断t~t1"

Hei*_*mus 3

在我看来,除了一个小错误之外,代码基本上是正确的:

编译器正确地抱怨spawnPos具有(多态)开始时间s,而 的开始时间eSpawnEvent固定为t,这是不同的。forall t后一个时间通过的类型签名中的部分纳入范围setupNetwork。也就是说,t代表整个网络的启动时间。

简单的解决方法是将有问题的行更改为

spawnPos :: Frameworks t => Moment t (AnyMoment Behavior DSCoord)
Run Code Online (Sandbox Code Playgroud)

  • 无论如何,您似乎在处理“forall”时遇到困难。这并不困难,但也不是完全简单。对于动态事件切换中`forall`的使用的基本介绍,我推荐[我的介绍性描述](http://apfelmus.nfshost.com/blog/2012/09/03-frp-dynamic-event-switching- 0-7.html)。您的问题可能比简单的 StackOverflow 答案所能容纳的更深刻。 (2认同)