ReactiveX 被认为是反应式编程吗? [关闭]

     2023-02-27     45

关键词:

【中文标题】ReactiveX 被认为是反应式编程吗? [关闭]【英文标题】:Is ReactiveX considered reactive programming? [closed] 【发布时间】:2016-06-09 08:31:54 【问题描述】:

来自ReactiveX introduction page:

它有时被称为“函数式反应式编程”,但这是用词不当。 ReactiveX 可能是函数式的,也可能是响应式的,但“函数式响应式编程”是另一种动物。主要区别之一是函数式反应式编程对随时间连续变化的值进行操作,而 ReactiveX 对随时间发出的离散值进行操作。

同时,来自Wikipedia's Functional Reactive Programming page,ReactiveX 被列在“实现”部分:

实现[编辑]

cellx,javascript 反应性的超快速实现 Elm,可编译为 HTML、CSS 和 JavaScript 的 FRP 语言 Ruby 中的星冰乐 FRP 实现 Flapjax,JavaScript 中的行为/事件 FRP 实现 Reactive.jl,Julia 中的 FRP 实现 ReactiveX、FRP 以多种语言实现,包括 Java、JavaScript、Python、Swift 等等 在 Haskell 中实现反应性香蕉 FRP 在 Swift 和 Objective-C 中实现的 ReactiveCocoa FRP 在纯 Swift 中实现的 ReactiveKit FRP 在 Haskell 中实现 Reflex FRP Scala(和 Scala.js)中的 Scala.Rx FRP 实现 在 C#、C++、Haskell(已弃用 [12])、Java、> Rust 和 Scala 中实现钠、FRP 在 Haskell 中实现 Yampa FRP

我很了解ReactiveX是做什么的,也对“反应式编程”和“函数式反应式编程”做了一些研究,但还是分不清它们之间的关系。

事实上,我有点相信 Wikipedia 页面是用词不当,或者错误地在“实现”部分列出了示例,因为我知道 cellx 和 ReactiveX(都在示例中列出)是构建的解决完全不同的问题。

【问题讨论】:

【参考方案1】:

reactive-banana 库的作者在这里。

函数响应式编程 (FRP) 和响应式编程 (RP) 之间的主要区别在于前者具有明确定义的指称语义,通常从类型中获得

type Behavior a  ~=  Time -> a
type Event    a  ~=  [(Time, a)]

而后者确实具有明确定义的指称语义。特别是,我知道的所有 RX 实现都存在以下问题:合并事件流是非确定性的:当流包含同时发生的事件时,有时一个事件会在另一个事件之前合并,有时反过来。

此外,“FRP 作用于随时间不断变化的值”的说法既有点不正确,也不是关键区别:

首先,该语句最可能的解析是“行为是连续函数Time -> a”,这是不正确的:行为可以是连续的,例如它们可以是阶跃函数。相反,FRP 中的 Time 通常被视为实数,即值的连续体。 其次,完全有可能在时间离散的情况下使用 FRP。这不是 RP 的主要区别,而是您对值的操作是否具有明确定义的指称语义。

【讨论】:

您好,谢谢您的回复,您能解释一下您在代码块中放入的那些类型吗? @TrungDQ 好吧,Time -> a 类型表示一个函数,其参数类型为Time,结果值类型为a。它可以解释为随时间变化的值。 [(Time, a)] 类型表示Time 类型值和a 类型值对的列表。它可以解释为在不同时间点发生的一组事件。【参考方案2】:

据我了解,从 ReactiveX(又名 RX)的角度来看,根本不可能同时发生两个事件。这些只是在内部按顺序按订阅顺序触发的回调。 RX 不“管理”时间。

在纯 FRP 程序员的眼中,RX 可以表现得相当疯狂。考虑以下 RXJS 代码:

const xs = Rx.Observable
    .interval(0)
  //.share();

xs.combineLatest(xs, (a,b) => [a,b])
    .filter(ab => ab[1] > ab[0])
    .take(1)
    .subscribe(ab => alert(ab));

这里的xs 是一个 可观察间隔,它会尽快触发。由于xs.combineLatest(ys, f) 总是先订阅xs,然后再订阅ys,你会期望xs.combineLatest(xs, (a,b) => [a,b]) 产生[0,0], [1,0], [1,1], [2,1], ... 所以ab[1] > ab[0] 应该始终为假。但是,在我的电脑上,如果我让这段代码运行一段时间,它确实会在某个时候结束it could take a while, try it yourself

这是因为xs 是一个cold observable:每次订阅interval 都会创建一个独立运行的周期性计时器。这些计时器可以并且会在某些时候以不同的顺序触发(尤其是在 .NET 等多线程环境中)

如果我们注释掉//share 行,使xs hot,序列永远不会完成,因为[0,0], [1,0], [1,1], ... ,[i,i-1],[i,i]... 现在是确定性生成的。这是因为一个热门的 observable 共享一个订阅。在这种情况下,只会创建一个计时器。

在真正的 FRP 系统中,这种行为是确定性的。但是,如果您真的要在真实 FRP 系统中连接到不同的硬件计时器,您也会得到与 RX 相同的行为,因为这些外部事件将以随机顺序触发,除非这两个计时器当然是完全同步的

【讨论】:

为啥捕获 RuntimeException 不被认为是一种好的编程习惯? [关闭]

】为啥捕获RuntimeException不被认为是一种好的编程习惯?[关闭]【英文标题】:WhyiscatchingaRuntimeExceptionnotconsideredagoodprogrammingpractice?[closed]为什么捕获RuntimeException不被认为是一种好的编程习惯?[关闭]【发布时间】:2014-08-1205:30:14... 查看详情

什么是“真正的”编程语言? [关闭]

...未编译。这是脚本。它并非在每个平台上都运行。PHP不被认为是一种“真正的”编程语言吗?什么是“真正的”编程语言?一种语言必须经过编译才能被 查看详情

AngularJS 是函数式反应式编程吗?

】AngularJS是函数式反应式编程吗?【英文标题】:IsAngularJSFunctionalReactiveProgramming?【发布时间】:2013-07-2415:00:39【问题描述】:每次看到FunctionalReactiveProgramming这个短语我都意识到我不明白它是什么。然后我回到thisquestion,想我... 查看详情

每个页面加载 20 个 SQL 查询真的被认为很多吗? [关闭]

】每个页面加载20个SQL查询真的被认为很多吗?[关闭]【英文标题】:Is20SQLQueriesperpageloadreallyconsideredalot?[closed]【发布时间】:2010-09-2510:39:38【问题描述】:我在BeholdWordPress,DestroyerofCPUs上阅读JeffAtwood的博客,看到那里的许多人认... 查看详情

为啥全局变量是邪恶的? [关闭]

...3-10-1002:25:37【问题描述】:我试图找出为什么使用global被认为在python(以及一般编程)中是不好的做法。有人可以解释一下吗?包含更多信息的链接也将不胜感激。【问题讨论】:【参考方案1】:这与Python无关;全局变量在任... 查看详情

学习PLC编程[关闭]

...程。无论哪种方式进行转换都是非常危险的,因为许多您认为应该可以转移的技能(模式等)会让您误入歧途。我告诉人们最大的不同是 查看详情

方法重载是不是被认为是多态性? [关闭]

】方法重载是不是被认为是多态性?[关闭]【英文标题】:IsMethodOverloadingconsideredpolymorphism?[closed]方法重载是否被认为是多态性?[关闭]【发布时间】:2011-01-2421:50:56【问题描述】:方法重载是否被认为是多态性的一部分?【问题... 查看详情

为啥循环引用被认为是有害的? [关闭]

】为啥循环引用被认为是有害的?[关闭]【英文标题】:Whyarecircularreferencesconsideredharmful?[closed]为什么循环引用被认为是有害的?[关闭]【发布时间】:2010-12-2605:37:27【问题描述】:为什么一个对象引用另一个引用回第一个对象的... 查看详情

打开和关闭 PHP 是不是被认为是不好的做法? [关闭]

】打开和关闭PHP是不是被认为是不好的做法?[关闭]【英文标题】:IsopeningandclosingPHPconsideredbadpractice?[closed]打开和关闭PHP是否被认为是不好的做法?[关闭]【发布时间】:2012-11-2500:26:08【问题描述】:我目前正在寻找一种将JavaScr... 查看详情

转载reactivex的理念和特点

...者地址:http://www.open-open.com/lib/view/open1440166491833.html ReactiveX是ReactiveExtensions的缩写,一般简写为Rx,最初是LINQ的一个扩展,由微软的架构师ErikMeijer领导的团队开发,在2012年11月开源,Rx是一个编程模型,目标是提供一致的编... 查看详情

rxjava中的概念

一、ReactiveX与RxJavaReactiveX的全称为ReactiveExtension,一般缩写为Rx,即我们平常所说的反应式编程。其设计原理主要使用了观察者模式,区分数据的生产者和消费者,通过事件流的方式进行数据的异步处理。RxJava是ReactiveXJava语言的... 查看详情

本地存储可以被认为是安全的吗? [关闭]

】本地存储可以被认为是安全的吗?[关闭]【英文标题】:Canlocalstorageeverbeconsideredsecure?[closed]【发布时间】:2013-06-2105:59:57【问题描述】:我需要开发一个可以长时间离线运行的网络应用程序。为了使其可行,我无法避免在本地... 查看详情

一般来说,哪个 Java ORM 被认为是性能最高的? [关闭]

】一般来说,哪个JavaORM被认为是性能最高的?[关闭]【英文标题】:WhichJavaORMisconsideredthemostperformantgenerallyspeaking?[closed]【发布时间】:2010-04-2117:50:27【问题描述】:一般来说,哪种JavaORM被认为是性能最高的?我意识到这可能意... 查看详情

为啥“log and throw”被认为是一种反模式? [关闭]

】为啥“logandthrow”被认为是一种反模式?[关闭]【英文标题】:Whyis"logandthrow"consideredananti-pattern?[closed]为什么“logandthrow”被认为是一种反模式?[关闭]【发布时间】:2011-10-0204:03:39【问题描述】:这个问题是由围绕thisar... 查看详情

使用 if(...) 时,为啥这被认为是一种好的编程习惯? [复制]

】使用if(...)时,为啥这被认为是一种好的编程习惯?[复制]【英文标题】:Whenusingif(...),whyisthisconsideredagoodprogrammingpractice?[duplicate]使用if(...)时,为什么这被认为是一种好的编程习惯?[复制]【发布时间】:2012-09-2409:02:02【问题描... 查看详情

使用 C# 的类型(反射)是不好的做法吗? [关闭]

...发布时间】:2020-03-2513:46:12【问题描述】:edit嗯,我不认为这是其他关于var的问题的重复。我在问反射,只是好奇它是否应该像var一样谨慎使用还要特别感谢Flydog57在cmets中的反应,我很感激他们~edit如果我的问题不恰当,请原... 查看详情

`list()` 被认为是一个函数吗?

】`list()`被认为是一个函数吗?【英文标题】:Is`list()`consideredafunction?【发布时间】:2019-05-0801:33:14【问题描述】:list在Python中显然是abuilt-intype。我在this问题下看到了一条评论,它调用list()一个内置函数。当我们检查文档时,... 查看详情

Javascript 是函数式编程语言吗?

...阶的函数,Javascript是否应该被称为函数式编程语言?我认为它缺少的主要是纯函数,它不像其他函数式语言,比如lisp(尽管这并不是它不成为函数式语言的真正理由......)【问题讨论】:@sl 查看详情