【发布时间】:2015-06-15 18:19:40
【问题描述】:
函数响应式编程是一种以纯函数方式指定副作用程序的方法。
最近我一直在使用 rxscala,它是 ReactiveX 的 Java/Scala 端口。它基于Observables 的概念,可以被视为某种类型的值流。
对于这个问题,我想排除处理时间连续变化(信号)的 FRP 方法。
从旧的 Observables 构建新的 Observables
这些 Observable 可以使用大量不同的函数组合起来,以创建新的 observable。这些类似于可应用于集合的函数。而这些已经很好理解了,我们知道Foldable、Traversable、Applicative、Monads 等等。
确实,可观察对象是可折叠、可遍历的单子,就像普通的集合一样。但是对于 observable,这些特征可以通过多种方式实现,因为 observable 比普通集合包含更多的信息(每个元素的时间信息)。并且结果还必须符合时间信息。
两个 Monad 实现
例如,monadic join(Scala 中的flatMap)可以至少以两种不同的、合理的方式实现:
-
在嵌套的可观察对象之间通过
switching,这会导致在下一个开始发射时截断当前活动的可观察对象,或者RxJava Switch Visualization http://reactivex.io/documentation/operators/images/switch.c.png
-
mergeing 嵌套的 observables 而不会丢弃或延迟任何事件。RxJava Merge Visualization http://reactivex.io/documentation/operators/images/mergeDelayError.C.png
-
...还有更多(参见 cmets)
限制
我对所提供的组合函数库感到非常满意,但我经常遇到无法实现我想要的结果的情况,我不得不退回到某种并发编程。
缺少组合器或大脑?
现在我想知道我是否太愚蠢而无法使用现有的组合器来构建所需的行为。还是 rxscala 中可用的组合函数不足以创建所有可以想象的行为?
问题
我要求证明一些基本的组合函数集B 足以从一些输入可观察对象创建“所有可想象的可观察对象”。
可能最困难的部分可能是“每一个可以想象的可观察的”的定义。 也许 Haskell 社区已经产生了类似的东西?
【问题讨论】:
-
这更多的是理论而不是实际问题。也许CSSE 更适合?
-
我认为这个问题写得没有多大意义。尽管响应式库试图尽可能通用,但它们通常在设计时考虑到特定类型的域。例如,您有用于 haskell 的 netwire 库,它假设大多数事物是连续值,偶尔需要事件,而其他一些库可能会更加强调事件并提供抽象,允许您将值视为如果它们是连续的。可能只是您的域不适合该库提供的模型。
-
@Cubic 我没有考虑时间连续框架。我会将它们排除在问题之外,因为这可能与离散情况有很大不同。否则我不得不不同意你的假设,即该库不适合我的用例——它非常适合,但只是缺少一些特殊功能(但也许不是)。
-
如果您喜欢以
Foldable、Applicative、Monad等方式思考,您可能会喜欢rxscalaz。 -
顺便说一句,单子连接的第三种可能实现是
concatMap...
标签: haskell functional-programming system.reactive reactive-programming rx-java