问题标签 [frp]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
288 浏览

haskell - Netwire 中的跳跃机制

我想我需要一些激励来了解如何制作这个,我在一般平台游戏机制方面并没有真正的经验......

无论如何,我的玩家身材到现在为止是这样的:

随着gravity,玩家对象慢慢下落,直到有东西可以站立。当然,下一步是在sin曲线中添加跳跃……添加它的简单方法是什么netwire?还可以添加进一步的碰撞检测吗?

我只是不知道从哪里开始。

0 投票
1 回答
1468 浏览

c++ - 为什么 boost::signals2::signal::connect 需要复制构造函数吗?

我正在研究一个表示正常数据值的对象,该对象利用函数式反应式编程,当依赖值发生变化时会改变它们的值。我的意思是,假设你有一个 var3 = var1 + var2; 然后当您更改 var1 的值时,var3 的值会自动更新。在 C++ 中,这很困难,但是在某个地方的另一个工作线程中调用了更新函数,你可以让它看起来是功能反应的。

所以这是我这样做的方法。我创建了一个名为 Reactive 的模板对象,其中可以包含任何类型,然后重载它的运算符,这样当这些反应中的两个被加在一起时,不仅结果值等于它们的总和,而且 lambda 是made 将操作存储在 std::function 中,以后可以在任何时候调用它的更新函数时再次调用它来更新结果的值。

出现了几个问题。如果依赖值之一被破坏怎么办。即使生成的 Reactive 仍然具有它认为有效的 lambda,但 lambda 使用的参数不再存在。为了解决这个问题,我求助于 boost::signals2 来建立一个信号和槽系统,以通知结果者他们的任何一个依赖者被破坏。当结果接收到信号时,它的影响函数被清空并且不会在更新时被调用。

为了让 Reactives 能够执行 + 操作,必须创建一个临时的响应式,它具有自己的信号,然后 = 运算符必须重载以将临时中的数据移动到生成的响应式。然而,信号不能被复制。我通过在 std::unique_ptr 中包含 destruct 信号来避开这个问题,当 operator = 收到 Reactive && 时使用 std::move。危机化解了。

现在这是我卡住的地方。后来我意识到,尽管移动构造很好,但仍然无法复制我的 Reactives 之一,因为可以说 var3 = var1 + var2; 然后你这样做: var4 = var3; 然后不知何故 var1 和 var2 中的破坏信号需要一种方法来通知 var4 它们已被破坏。我最终想出的是设置它,以便我有一个名为 Proxy 的子对象,它是一个函子,包含一个 boost::signals2::signal,然后每个对象都会有一个包含在 std::shared_ptr . 如果 Reactive 有对该代理的引用,那么它将它的通知销毁方法连接到该代理。然后依赖者将信号附加到该代理。当代理被调用时,它也会调用它的所有连接。

问题是,将代理连接到依赖信号需要代理具有复制构造函数,或者至少,这是 msvc 给我的错误。显然 boost::signals2::signal::connect 使用它的复制构造函数,它不能因为代理本身包含一个信号。我给你所有这些信息,因为我仍然不确定这是否是最好的解决方案。我选择信号和插槽是因为我对它们最熟悉,但是如果您有更好的解决方案,请指出。否则,请帮助我避免此错误。

顺便说一句,Slot 只是使 Unreact() 函数成为仿函数的一种方式,每个 Reactive 都是唯一的。

这是对象:

和简单的测试

以下是警告/错误:

0 投票
1 回答
143 浏览

nomenclature - 我需要一个类似“去抖动”的名称,但不完全相同

这是一个有趣的。我正在使用 FRP,并查看各种库(jQuery、Bacon.js)中的“去抖动”方法。我开始使用它,发现它几乎可以满足我的需求,但有细微的差别。这是我对 debounce 的理解,因为它与事件处理有关:

当一个事件至少以一定的频率发生时,不要做任何事情。一旦事件减慢到低于频率,触发事件处理程序。例如(伪代码)key-presses.debounce(1 second) then Alert,如果按键在一秒钟内被按下,我们将看不到任何事情发生,直到最后一个按键被按下后 1 秒,然后我们会得到一个警报。

我需要的是在序列开始时触发的东西,而不是在结束之后。因此,对于同一个示例,我们会立即看到警报,然后什么也没有。如果用户在至少 1 秒后再次开始按键,我们会收到另一个警报,然后什么都没有。

代码很简单——我只想要一个名字。频率仍然需要一个参数:BeginSequence(1000)?到期后(1000)?

有什么建议么?

0 投票
1 回答
406 浏览

haskell - 具有反应香蕉和 gtk2hs 的反应表

我写了一个小应用程序来跟踪我在电视剧中的进展。该应用程序是用 Haskell 编写的,带有功能响应式编程 (FRP) 和响应式香蕉

该应用程序可以:

  • 在表中添加/删除新电视剧
  • 更改系列的季节和剧集

应用截图

我在编写将新电视剧添加到表格并连接新事件的代码时遇到问题。此处的 CRUD 示例对我没有太大帮助,因为我有更多要求,然后只是从列表中选择一个元素。

如何以 FRP 方式编写类似于 CRUD 示例中的reactiveTable函数的函数reactiveListDisplay?网络编译后,如何为删除按钮和季节和剧集旋转按钮添加事件?

我想重构 insertIntoTable 方法以使用事件和行为,而不是使用简单的回调。

编辑:

我已经尝试了带有ListStore后端的 gtk TreeView 。在这种情况下,您不需要动态事件切换。我编写了下面的函数来获取插入、更改和删除事件的列表行为。它有效^^reactiveList

我愿意接受意见和建议。

0 投票
1 回答
303 浏览

haskell - 功能香蕉旅行者 - 计时器和玩家独立事件

我在我的 Traveler 中尝试处理与玩家无关的游戏状态更新。作为参考,项目在这里(开发分支是这个问题的相关分支)。

Libraries/Universe/GameState.hs有一个函数,updateGS它处理所有玩家对游戏状态的更新。现在的EventNetwork样子是这样的。

实现这个计时器的问题是,我看过的所有示例都有一个与我不同的用例,即物理模拟。这个游戏不涉及物理。我正在尝试使用计时器来评估游戏状态,而不受玩家操作的影响。目前,我唯一想要管理的就是超空间旅行。完全实施后,从一个行星移动到另一个行星会将Agent's更改locationRight Hyperspace。现在需要发生的是,当 atick发生时,distanceTraversed加一。那么如果distanceTraversedequalstotalDistance Agent的位置就变成了Left Planet

EventNetwork那么从的角度来看,这会是什么样子呢?

现在结合行为

这是正确的轨道吗?

0 投票
2 回答
237 浏览

haskell - 优化 FRP 系统

我必须写一篇关于函数响应式编程(FRP)系统优化的论文。

以下是我目前找到的参考资料。

  • 使用广义代数数据类型的函数响应式编程的动态优化,Henrik Nilson

  • 降低:透明功能反应性的静态优化技术,Kimberly Burchet 等人。

除此之外,还有任何其他参考或建议如何优化 FRP 系统的图表吗?

0 投票
1 回答
1102 浏览

javascript - Bacon.js 懒评估,鼠标拖拽示例不使用 log() 语句中断

我正在尝试了解 bacon.js 和 FRP,因此尝试制作一个简单的拖放示例,但是我在懒惰地评估一段代码时遇到了麻烦。当我将 a 添加.log()到流中时,它看起来看起来和行为都很好,但是如果我把它拿出来,它就不会更新。这是我正在做的事情:

这是它的一个jsFiddle

我在想我可能做错了,这甚至是正确的方法吗?我想在单击块时通过块的位置,该位置应该更新mousedown但不与mousemove.

0 投票
3 回答
2576 浏览

haskell - 为什么递归`let`使空间有效?

我在学习功能响应式编程时发现了这个声明,来自Hai Liu 和 Paul Hudak的“用箭头堵住空间泄漏” (第 5 页):

这里的差异似乎很小,但它极大地提高了空间效率。为什么以及如何发生?我做出的最好的猜测是手动评估它们:

如上所述,我们需要为这些递归创建无限的新 thunk。然后我尝试评估第二个:

在第二种形式中,xs出现并且可以在它出现的每个地方之间共享,所以我想这就是为什么我们只能需要O(1)空格而不是O(n). 但我不确定我是否正确。

顺便说一句:关键字“共享”来自同一篇论文的第 4 页:

这里的问题是标准的按需调用评估规则无法识别该函数:

是相同的:

前一种定义导致在对 f 的递归调用中重复工作,而在后一种情况下,计算是共享的。

0 投票
1 回答
436 浏览

haskell - 推与拉反应香蕉

我正在使用响应式香蕉构建一个类似媒体播放器的应用程序。

假设我想要一个Behavior代表曲目列表中当前选定曲目的曲目。

我有两个选择:用于fromPoll在需要时获取当前选择;或使用fromChanges并订阅选择更改事件。

Behavior只有当用户按下“播放”按钮时,我才会使用选定的曲目。此事件比选择更改要少得多。

鉴于此,我认为这fromPoll会比fromChanges在这种情况下更好/更有效。但是文档说“获得Behaviors 的推荐方法是使用fromChanges”。

它在这里仍然适用吗?即轮询操作是否会比网络实际使用(采样)的频率更高?

0 投票
0 回答
140 浏览

haskell - 机能香蕉旅者-断型之谜

我收到以下错误:

t0in the和Eventthe t1in theBehavior是我对这个问题的线索,但我不知道如何解释这个线索。所以让我们从一些类型开始,错误的代码和我对它为什么应该工作的推理。

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给我们一个 type Behavior t (AgentMap -> AgentMap)。快到了吧?

鉴于此 (<@) :: f a -> g b -> g aeTick :: Event t ()

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

要得到Event t (AgentMap -> AgentMap)

但没那么快。我的推理一定在某个地方失败了。谁能告诉我在哪里?

更新:原来这个问题的发生是因为 eTick 没有定义(我认为)。我曾试图将大部分代码分离到它自己的文件中。我知道离开 eTickundefined不会令人满意,但我还没有弄清楚我想对此做些什么。因此,与此同时,我开始将代码移动到最初的let绑定中。现在我的代码编译了。我不希望let绑定在那里停留太久。我的期望是重新审视这个突破性项目将告诉我如何更好地构建我的代码。