函数式反应式编程的“信号”表示是否正确?

2024-03-16

我一直在研究 FRP 并发现了许多不同的实现。我见过的一种模型我将其称为“信号”表示。这一本质将事件和行为结合成一个实体。

首先,信号是一个对象,其值是一种行为。其次,信号具有一个事件“流”,可以将其视为标准数据结构并对其进行操作(您可以在信号上使用“每个”、“映射”和“过滤器”等来定义事件的反应方式)。例如,我可以这样做(其中“时间”是时间的信号表示):

time.each { t => print(t) } // every time there is a 'tick' the current time is printed
a = time * 5 //where 'a' would be a dynamic value always up to date with time

FRP 的这种表示方法正确还是有问题?我非常喜欢这种工作方式,也喜欢它的个人描述是多么简单,但我不确定它是否正确。


不幸的是,将“事件”和“行为”合并为单个实体“信号”效果并不那么好。

据我所知,大多数基于信号的 FRP 实现最终都会创建一个额外的“事件”类型,类似于

type Event a = Signal (Maybe a)

因此,事件的概念并没有消失,也没有真正的简化。事实上,我认为信号类型是语义的复杂化。信号之所以受欢迎只是因为它们更容易实现。

反对信号的主要论点是它们不能代表连续时间行为,因为它们必须迎合离散事件。在康纳尔·埃利奥特的最初的愿景 http://conal.net/papers/icfp97/,行为是时间的简单连续函数

type Behavior a = Time -> a
-- = function that takes the current time as parameter and returns
--   the corresponding value of type  a

相反,信号始终是离散的,并且通常与固定的时间步长相关。 (有可能实施事件和行为都位于可变时间步信号之上,但它本身并不是一个很好的抽象。)将其与事件流进行比较

type Event a = [(Time,a)]
-- list of pairs of the form (current time, corresponding event value)

其中各个事件不一定以规则的时间间隔发生。

区分行为和事件的论据是它们的 API 完全不同。要点是它们有不同的产品类型:

(Behavior a , Behavior b) = Behavior (a,b)
(Event a    , Event b   ) = Event (a :+: b)

换句话说:一对行为与成对行为相同,但一对事件与来自任一组件/通道的事件相同。还有一点就是有两个操作

(<*>) :: Behavior (a -> b) -> Behavior a -> Behavior b
apply :: Behavior (a -> b) -> Event a    -> Event b

它们具有几乎相同的类型,但语义却截然不同。 (第一个参数在第一个参数更改时更新结果,而第二个则不更新。)

总结一下:信号可用于实现 FRP,对于尝试新的实现技术很有价值,但对于只想使用 FRP 的人来说,行为和事件是更好的抽象。

(全面披露:我已经实现了一个名为的 FRP 库反应香蕉 http://haskell.org/haskellwiki/Reactive-banana在哈斯克尔。)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

函数式反应式编程的“信号”表示是否正确? 的相关文章

  • 在 Scala 中的 List[Either] 上使用 flatMap

    Either从 Scala 2 12 开始是右偏的 这使得它可以在 for yield 块中使用 而无需投影 就像Option 但显然这还不足以表现得像Option当与flatMap object Main def main args Ar
  • Erlang 参与者与 OOP 对象有何不同?

    假设我有一个 Erlang actor 定义如下 counter Num gt receive From increment gt From self new value Num 1 counter Num 1 end 同样 我有一个 Ru
  • D 中的特征可以用于类型类吗?

    我是 D 新手 我正在寻找一种使用类似 Haskell 的类型类进行编程的好方法 例如D 中的函子 幺半群等 Tango 或 Phobos 中是否实现了类似的功能 我听说过可以对某些属性进行编译时类型检查的特征 它们可以用于类型类吗 我尝试
  • Kotlin 的不同类型的 reduce() 函数

    我正在查看数组扩展函数并发现reduce one inline fun
  • 左/右旋转进位的实际用途

    循环左进位和循环右进位指令有哪些实际用途 在我的汇编课上 我们无法想出一个有用的好例子 如果要将位从一个操作数移出并移入另一个操作数 SHL EAX 1 move sign bit of EAX RCL EDX into LSB of ED
  • 如何在自定义 rxcpp 运算符上调用 on_error

    我创建了一个简单的 rx 运算符 它将字符串流转换为 json 流 并且工作正常 但是 我希望能够引发自定义异常 并且我不知道如何调用on error认购方式 操作员称为convertStringToJson可以在此处找到工作示例 http
  • 如何使用谷歌趋势查找编程语言流行总体趋势的统计数据

    我喜欢关注趋势浏览器 操作系统 语言等 我发现谷歌趋势是一个非常有用的资源有时但有时我无法获得我想要的信息 与多年来其他主要 Linux 发行版相比 Ubuntu 的增长非常明显 在发布日期附近有 6 个月度峰值 由于非编程相关事件而出现偏
  • 什么是(函数式)反应式编程?

    Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话 但却具有历史意义 目前不接受新的答案或互动 我读过维基百科的文章反应式编程 http en wikipedia org wiki Reac
  • 返回元组的第一个元素

    假设我创建一个将两个整数相加的函数 def addInt a Int b Int Int Int val x a b x 2 我回来了 result 2 故意为了这个问题 现在我想创建一个仅返回 x 的变量 val result addIn
  • 计算 python 字典/数组数据结构的非空尾叶 - 递归算法?

    我正在寻找一个函数来查找一种复杂字典 数组结构的所有非空端点 我认为因为我不知道嵌套数组的数量或它们的位置 所以它必须是递归的 而我只是还没有完全理解这种思维方式 所以对于嵌套字典 x top middle nested value nes
  • 为什么要使用 Python 进行函数式编程?

    在工作中 我们过去常常以非常标准的面向对象方式来编写 Python 程序 最近 有几个人加入了功能性潮流 他们的代码现在包含更多的 lambda map 和reduce 我知道函数式语言有利于并发性 但是函数式 Python 编程真的有助于
  • 了解 rxjs 中的背压 - 仅缓存 5 个等待上传的图像

    我正在开发一个节点项目 需要提交数千张图像进行处理 在将这些图像上传到处理服务器之前 需要调整它们的大小 因此我有一些类似的内容 imageList map image gt loadAndResizeImage merge 3 map i
  • Winform 没有.NET 框架?

    我必须创建一些表单并将其作为直接 EXE 提供 而不是安装程序 它安装 NET 框架 最终用户对此不满意 他们想要可以直接打开和工作的东西 我知道它可以作为网络完成 但我正在寻找 winforms 吗 请建议哪种工具 技术可以处理这个问题
  • 语言是如何以及为何形成的/是否有任何正在发展的语言表现出希望? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Ruby 反向柯里化:这可能吗?

    关于 Ruby 1 9 x 中的柯里化 我一直在某些地方使用它 并且可以像基本上支持 proc 参数的默认参数一样进行翻译 p proc x y z x y z p curry 1 gt returns a lambda p curry 1
  • F# 编码练习

    我一直在 Visual Studio 2010 中涉足 F 我是一名在 C 和 Java 等面向对象语言方面拥有更多代码 架构设计经验的开发人员 为了扩展我的技能并帮助做出更好的决策 我正在尝试使用不同的语言来做不同的事情 特别是掌握使用函
  • OCaml 作为 C 库,hello world 示例

    我希望通过 C 调用 OCaml 代码 方法是将 OCaml 编译为包含 C 接口的静态或共享库 这一页 https caml inria fr pub docs manual ocaml intfc html似乎解释了如何为 OCaml
  • 哪些编程语言不被视为高级语言? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 在信息学理论中 我一直听到和读到有关高级和低级语言的内容 然而我不明白为什么这仍然相关 因为除了今天使用的汇编语言之外 没有任何 相关的 低级语
  • 在依赖类型的函数式编程语言中,扁平化列表是否更容易?

    在 haskell 中寻找一个可以展平任意深度嵌套列表的函数时 即应用的函数concat递归并在最后一次迭代时停止 使用非嵌套列表 我注意到这需要有一个更灵活的类型系统 因为随着列表深度的变化 输入类型也会变化 确实 有几个 stackov
  • 如何将 Observable>> 转换为 Observable>

    我陷入了如何将以下可观察类型转换 转换为我的目标类型的困境 我有以下类型的可观察值 Observable

随机推荐

  • 如何检查 Java 上的 SSLSocket 连接是否正常?

    我有一个 SSLSocket 池 我需要在借用对象之前检查套接字连接是否正常 isConnected isInputShutdown 和 isOutputShutdown 没有用 因为它们不检查双方是否已连接 如果我尝试从套接字写入或读取
  • 删除表中的行会导致 LOCKS

    我正在运行以下命令从大型表 1 5 亿行 中批量删除行 DECLARE RowCount int WHILE 1 1 BEGIN DELETE TOP 10000 t1 FROM table t1 INNER JOIN table2 t2
  • 为什么 React useState 钩子不能在 for 循环中工作?

    我很好奇为什么在 for 循环中设置状态不能按预期工作 这是我使用钩子的代码 const count setCount useState 0 const onButtonPress gt for let i 0 i lt 100 i set
  • 此脚本(使用 Outlook 发送电子邮件)如何工作?

    谁能帮助我了解 MAPI 的工作原理 我有一个简单的 vbscript 它使用 MAPI 发送电子邮件 它工作得很好 但是 我不知道它是如何做到的 后台发生了什么 Const ForReading 1 Set args WScript Ar
  • Jquery - 根据 的内容应用类

    我有一个水平导航菜单 我可以编辑其源代码 我唯一的选择是在通过 JQUERY 加载时动态添加类 假设我有 3 个选项卡 Home Profile Blog 每个都有一个链接 如下所示 a href home html Home a JQUE
  • 按距给定的升序距离对点数组进行排序

    我需要你的帮助 我有一个已知坐标的点 例如 x 5 y 4 和每个代表点的对象数组 x 2 y 6 x 14 y 10 x 7 y 10 x 11 y 6 x 6 y 2 现在我需要按距给定点的距离按升序对数组进行排序 例如 x 6 y 2
  • 识别表中所选行何时已被选择

    我有一个p datatable在 primefaces 中 我有不同的侦听器 以不同的方式在数据表中选择行事件 我需要确定表中所选行何时已被选择 我该怎么做 我需要这个因为我不想那个p blockUI当我选择表中已选择的行时运行 有我的页面
  • textcat -> 不允许架构额外字段

    我一直在尝试练习从本教程中学到的知识 https realpython com sentiment analysis python https realpython com sentiment analysis python 使用 PyCh
  • 如何仅使 Dropzone.js Previews Div 可点击而不是整个表单

    我必须使用 dropzone js 表单 它将几个输入和一个文件上传信息发送到另一个页面 我的 dropzone 代码如下所示 gt Dropzone options mydropzone maxFiles 1 maxFilesize 10
  • 如何在Python中根据特定日期提取前两年的数据?

    我有一个 csv 文件 其中包含过去 3 年的时间序列月度数据 根据今天的日期 我只想读取前两年的数据来预测未来 Data file example has data from 01 01 15 to 31 10 19 Date Value
  • iOS 10 后台 CoreBluetooth 广告

    首先 我有一台 iPad Air 2 和一台 iPhone 7 为了进一步阅读 我们估计该应用程序在 iPad 上处于活动状态并打开 在 iPhone 上处于后台模式 该应用程序完全相同 即使具有相同的蓝牙服务 UUID 和相同的 Data
  • UIDocument 未保存?

    无论我尝试什么 这都行不通 我正在尝试使用UIDocument在本地保存我的 文本 文件 当我创建文件 即未加载 时 它保存得很好 However 如果我通过打开文件然后保存来加载文件 则它根本不会保存 EDIT 我尝试在应用程序进入后台时
  • SQL 条件并集

    问题 我有一个返回文件列表的 SQL 函数 现在我应该使用联合将一个附加列表加入到该列表中 但前提是用户是管理员 那可能吗 就像是 CREATE FUNCTION tfu CMS Process bIsAdmin bit Add the p
  • 使用箭头键滚动 div

    这类似于SO 如何用箭头键移动div https stackoverflow com questions 4950575 how to move a div with arrow keys 所以也许一个明确且知情的 不 就足以作为答案 我可
  • Passport js通过url验证

    我在我的应用程序中使用 Express JS 和 Passport JS 我想为新用户提供通过特定 URL 自动登录一次的机会 我可以使用 URL 中的信息从数据库中获取用户 因此我有一个 User 对象 带有 id 电子邮件 散列密码等
  • 在 HttpWebRequest 中添加自定义标头

    我需要添加一些自定义标头HttpWebRequest目的 如何添加自定义标头HttpWebRequestWindows Phone 7 中的对象 您使用Headers具有字符串索引的属性 request Headers X My Custo
  • 如何使用 Backbone 处理单页应用程序的 UI 状态

    请耐心等待 因为我来自传统的 Web 开发背景 使用 ASP Net 甚至服务器端 MVC 我正在尝试使用 Backbone js 构建一个高度交互的单页应用程序 以帮助组织我的 javascript 代码并构建 UI 我在构建 UI 组件
  • JAVA_HOME 未正确定义 编译时出错

    我正在 cocoa 中开发一个使用一些 java 类的应用程序 我收到错误 JAVA HOME 未正确定义我们无法执行 System Library Frameworks JavaVM framework Home bin java 我不知
  • Java,默认编码[重复]

    这个问题在这里已经有答案了 可能的重复 jvm默认编码是什么 https stackoverflow com questions 1006276 what is the default encoding of jvm Hello 当用于处理
  • 函数式反应式编程的“信号”表示是否正确?

    我一直在研究 FRP 并发现了许多不同的实现 我见过的一种模型我将其称为 信号 表示 这一本质将事件和行为结合成一个实体 首先 信号是一个对象 其值是一种行为 其次 信号具有一个事件 流 可以将其视为标准数据结构并对其进行操作 您可以在信号