haskell - Reactive-Banana 中的动态事件切换

标签 haskell frp reactive-banana

我目前正在开发一款利用 React Banana 和 SDL 的小游戏。由于目标主要是了解更多有关响应式(Reactive)香蕉和 FRP 的知识,因此我尝试使用动态切换来设置游戏对象的集合,但到目前为止还没有取得太大成功。

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

还有更多在响应式香蕉中使用动态事件切换的示例吗?

据我了解,我得到一个 Moment t (Anytime Behaviour a),使用execute 创建一个 Event t (Anytime Behaviour a),然后依次用于更新携带集合的Behavior。 时刻 t(任意时间行为 a)是使用 tribB 在从触发事件创建的行为上创建的。如果此触发事件源自事件网络,则编译时不会出现错误消息“无法推断 (t ~ t1)”。我不确定 ~ 到底意味着什么,但它显然会抛出错误,因为事件网络的两个框架值 (t) 和这个新的 Moment 值是不同的。

所以,长话短说,我不明白响应式(Reactive)香蕉中的事件切换是如何工作的,我也不知道为什么。理论上应该是相对简单的。

编辑:

-- 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)
                [...]

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

编辑2:

它可以工作,但是现在我使用execute创建事件的行上出现了相同的错误。 “无法推导出 t ~ t1”

最佳答案

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

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

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

spawnPos :: Frameworks t => Moment t (AnyMoment Behavior DSCoord)

关于haskell - Reactive-Banana 中的动态事件切换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15163414/

相关文章:

haskell - Haskell 中的远程生成过程

haskell - yesod二进制文件应在哪里找到config文件夹?

haskell - 是否可以为 Arrows 而不是 ArrowApply 写下 join?

haskell - 功能性香蕉旅行者游戏 - 有趣而疯狂

haskell - HOAS 和 FOAS 的区别

javascript - 使用 RxJS 链接 promise

haskell - Iteratees和FRP之间有什么联系?

javascript - 函数式响应式编程相对于事件监听器的优势

haskell - 在 Reactive Banana 中寻找 `flatten::Event [a] -> Event a`

haskell - Functional Banana Traveler - 我的滴答事件有什么问题?