Mas*_*tic 17 theory haskell functional-programming frp reactive-programming
行为被普遍定义为"时变值" 1.
为什么?时间是变化值的依赖/参数非常罕见.
我对FRP的直觉是将行为改为事件变化值; 它更常见,更简单,我发布了更多有效的想法,并且可扩展到足以支持时间(tick事件).
例如,如果你编写一个计数器,你不关心时间/相关的时间戳,你只关心"点击增加按钮"和"减少按钮点击"事件.
如果你写一个游戏并想要一个位置/力量行为,你只关心WASD /箭头键举行的事件等(除非你禁止你的球员在下午向左移动;多么不公平!).
所以:为什么时间是一个考虑因素?为什么时间戳?为什么一些库(例如reactive-banana,reactive)把它上升到具有的程度Future,Moment值?为什么使用事件流而不是仅响应事件发生?所有这一切似乎都过于复杂化了一个简单的想法(事件变化/事件驱动值); 有什么好处?我们在这里解决了什么问题?(如果可能的话,我也希望得到一个具体的例子和一个精彩的解释).
J. *_*son 12
Behaviors与Events 的不同之处主要在于a Behaviora 现在具有值,而Event只有在新事件进入时才有值.
那么"现在"是什么意思呢?从技术上讲,所有更改都是作为事件流上的推送或拉取语义实现的,因此我们只能表示"最后一个事件的最新值Behavior".但这是一个相当毛茸茸的概念 - 在实践中"现在"更简单.
为什么"现在"更简单的原因归结为API.以下是Reactive Banana的两个例子.
最终,FRP系统必须始终产生某种外部可见的变化.在Reactive Banana中reactimate :: Event (IO ()) -> Moment (),消耗事件流的功能促进了这一点.没有办法让Behavior触发器发生外部变化 - 你总是需要做一些事情,比如reactimate (someBehavior <@ sampleTickEvent)在具体时间采样行为.
行为与Applicatives不同Event.为什么?好吧,让我们假设Event是一个适用想想,当我们有两个事件流发生了什么f,并x写f <*> x:由于事件在不同时间发生的所有的机会f和x所定义的同时是(几乎可以肯定)0.因此f <*> x总是意味着空事件流是没用的.
你真正想要的是f <*> x缓存每个值的最新值,并"始终"使用它们的组合值.这在事件流方面谈论的概念确实令人困惑,因此我们考虑f并x考虑所有时间点的值.现在f <*> x也定义为获取所有时间点的值.我们刚刚发明了Behaviors.
Con*_*nal 12
因为这是我能想到的最简单的方法,可以为行为概念提供精确的表示(与实现无关的含义),包括我想要的各种操作,包括区分和整合,以及跟踪一个或多个其他行为(包括但不限于用户生成的行为).
为什么?时间是变化值的依赖/参数非常罕见.
我怀疑你把行为的构造(配方)与其含义混淆了.例如,可以通过依赖于诸如用户输入之类的东西来构造行为,可能具有额外的合成变换.所以有配方.然而,含义仅仅是时间的函数,与用户输入的时间函数有关.请注意,通过"函数",我的意思是在单词的数学意义上:从域(时间)到范围(值)的a(确定性)映射,而不是在纯粹的程序化描述的意义上.
我已经看到很多问题,问为什么时间很重要以及为什么连续时间.如果你应用简单的规则来赋予指称语义风格的数学意义(一种简单而熟悉的功能程序员风格),问题就会变得更加清晰.
如果你真的想要了解FRP背后的本质和思考,我建议你阅读我对"功能反应式编程语言规范"的回答并遵循指针,包括"什么是功能反应式编程".
| 归档时间: |
|
| 查看次数: |
1190 次 |
| 最近记录: |