- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
所有示例都使用 Ramda
作为 _
(很清楚示例上下文中的方法做什么)和 kefir
作为 frp
(与 bacon.js 中的 API 几乎相同)
我有一个流,它描述了位置的变化。
var xDelta = frp
.merge([
up.map(_.multiply(1)),
down.map(_.multiply(-1))
])
.sampledBy(frp.interval(10, 0))
.filter();
当我按下 UP
键时,它会发出 +1
,而当我按下 DOWN
时,它会发出 -1
。
为了获得位置,我扫描
这个增量
var x = xDelta
.scan(_.add)
.toProperty(0);
这是预期的工作。但我想将 x
的值从 0
限制到 1000
。
为了解决这个问题,我找到了两个解决方案:
在scan
中改变函数
var x = xDelta.scan(function (prev, next) {
var newPosition = prev + next;
if (newPosition < 0 && next < 0) {
return prev;
}
if (newPosition > 1000 && next > 0) {
return prev;
}
return newPosition;
}, 0);
看起来还可以,但是以后随着新规则的出台,这个方法会越来越多。所以我的意思是它看起来不可组合和 FRPy。
我有当前
职位。和 delta
。我想将 delta
应用于 current
,前提是 current after applying
不会超出限制。
current
取决于 delta
delta
取决于 current after applying
current after applying
取决于current
所以看起来像循环依赖。但我使用 flatMap
解决了它。
var xDelta = frp
.merge([
up.map(_.multiply(1)),
down.map(_.multiply(-1))
])
.sampledBy(frp.interval(10, 0))
.filter();
var possibleNewPlace = xDelta
.flatMap(function (delta) {
return x
.take(1)
.map(_.add(delta));
});
var outOfLeftBoundFilter = possibleNewPlace
.map(_.lte(0))
.combine(xDelta.map(_.lte(0)), _.or);
var outOfRightBoundFilter = possibleNewPlace
.map(_.gte(1000))
.combine(xDelta.map(_.gte(0)), _.or);
var outOfBoundFilter = frp
.combine([
outOfLeftBoundFilter,
outOfRightBoundFilter
], _.and);
var x = xDelta
.filterBy(outOfBoundFilter)
.scan(_.add)
.toProperty(0);
您可以在 iofjuupasli/capture-the-sheep-frp 查看完整的代码示例
它正在运行演示 gh-pages
它有效,但使用循环依赖可能是反模式。
有没有更好的办法解决FRP中的循环依赖?
使用 Controller
可以从两个 Model
中读取一些值,并根据它的值更新它们。
所以依赖看起来像:
---> Model
Controller ---|
---> Model
对于 FRP,没有 Controller
。因此,Model
值应该根据其他 Model
以声明方式计算。但是如果 Model1
从另一个相同的 Model2
计算,那么 Model2
从 Model1
计算呢?
Model ----->
<----- Model
例如两个具有碰撞检测的玩家:两个玩家都有position
和movement
。而第一个玩家的移动
取决于第二个玩家的位置
,反之亦然。
我在这方面还是个新手。经过多年的命令式编码,开始以声明式 FRP 风格思考并不容易。可能我遗漏了什么。
最佳答案
using circular dependencies is probably anti-pattern
是也不是。从你实现它时遇到的困难,你可以看出很难创建循环依赖。特别是以声明的方式。但是,如果我们想使用纯声明式风格,我们可以看到循环依赖是无效的。例如。在 Haskell 中你可以声明 let x = x + 1
- 但它会评估为异常。
current
depends ondelta
,delta
depends oncurrent after applying
,current after applying
depends oncurrent
如果你仔细观察,它不会。如果这是一个真正的循环依赖,current
从来没有任何值(value)。或者 threw an exception .
相反,current
确实取决于它之前的状态。这是 FRP 中众所周知的模式,即 stepper。取自this answer :
e = ((+) <$> b) <@> einput
b = stepper 0 e
不知道是什么<$>
和 <@>
确实如此,你大概可以说出事件是如何发生的e
和行为(“属性(property)”)b
取决于事件einput
.更好的是,我们可以声明性地扩展它们:
e = ((+) <$> bound) <@> einput
bound = (min 0) <$> (max 1000) <$> b
b = stepper 0 e
培根在 scan
中基本上就是这么做的.不幸的是,它迫使您在一个回调函数中完成所有这些。
我还没有看到 stepper
在任何 JS FRP 库中运行1。在培根和开菲尔中,您可能必须使用 Bus
如果你想实现这个模式。 我很高兴被证明是错误的:-)
[1]:好吧,除了我自己实现的那个(它还不能展示)。但是使用 Stepper
仍然感觉像在跳圈,因为 JavaScript 不支持递归声明。
关于javascript - FRP 中 EventStreams 的循环依赖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29478305/
我需要实现一个行为: 点击元素时 - 会发生一件事 但是当单击并按住超过一秒时,会发生其他情况(例如元素变得可拖动),然后第一个事件永远不会触发 我想我知道如何捕获点击并按住类型的事件,但如何区分第一
1 frp介绍 注意事项: 1)服务器端和内网机器端下载的版本要相同,否则可能会影响内网穿透 2)根据服务器系统选择合适的脚本 脚本主要分为服务端与客户端文件 1.外网服务器端用到的是Frps和Frp
1 frp介绍 注意事项: 1)服务器端和内网机器端下载的版本要相同,否则可能会影响内网穿透 2)根据服务器系统选择合适的脚本 脚本主要分为服务端与客户端文件 1.外网服务器端用到的是Frps和Frp
我目前正在阅读 WebSharper 的文档.在 the section about FRP , 它指出: Functional Reactive Programming (FRP) typicall
我目前正在研究我的下一个项目。这是在一个预先规划阶段,所以这个问题只是为了了解现有技术。 设置 我有一个具有多个输入和输出的有向无环图 (DAG),现在考虑人工神经元网络: 处理这种结构的常用方法是在
我可以构建一个PID controller在 Haskell FRP 库中 netwire使用为 Wire 提供的 ArrowLoop 实例中的 loop。 我还可以使用 switch 实现 Cont
我目前正在尝试了解箭头和 FRP,并且遇到了一个问题,我似乎无法将其映射到 FRP,即如何对道路网络进行建模。 我想我可以将道路网络建模为箭头,其中每个箭头代表一个路段。它在地点和时间接受汽车流,并生
我正在 Scala 中实现 FRP 框架,我似乎遇到了问题。出于某种想法,这个问题我决定限制我的框架的公共(public)接口(interface),以便只能在“现在”中评估行为,即: behavio
我一直在使用 Haskell(特别是 Yampa)中的 Arrowized FRP 库,但我不太清楚如何进行“连续”切换。我的意思是信号通过信号函数(下面的 sf),它本身就是一个信号(如图像的上半部
在经典 FRP 的最新实现中,例如 react 香蕉,有事件流和信号,它们是阶跃函数( react 香蕉称它们为行为,但它们仍然是阶跃函数)。我注意到 Elm 只使用信号,并没有区分信号和事件流。此外
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提出有关书籍、工具、软件库等建议的问题。您可以编辑问题,以便可以用事实和引用来回答它。 7年前关
我必须写一篇关于函数响应式(Reactive)编程 (FRP) 系统优化的论文。 这是我目前找到的引用资料。 使用广义代数数据类型进行函数式响应式(Reactive)编程的动态优化,Henrik Ni
我想在 Haskell 中学习 FRP,但是决定使用哪个库有点困难。许多尝试似乎已经失败,有些似乎又复活了(例如最近在 Yampa 上的事件)。 从我读到的内容来看,FRP 似乎有两种“类型”:一侧是
我必须写一篇关于函数响应式(Reactive)编程 (FRP) 系统优化的论文。 这是我目前找到的引用资料。 使用广义代数数据类型进行函数式响应式(Reactive)编程的动态优化,Henrik Ni
我刚开始使用 Bacon.js这真的很棒。尽管有时我确实很难找到正确的做事方式。例如,我想要一个带有可拖动部分的 Angular Directive(指令)。我不要脸的扒进别人的jsBin并尝试将该代
我正在使用BaconJS创建两个事件流,如下所示: # Wait for start of the module sStart = Bacon.fromCallback module.onStart.
有人说 FRP 是在不显式管理状态的情况下处理事件流。例如这个人: http://www.slideshare.net/borgesleonardo/functional-reactive-progr
我的问题是关于 FRP 中“状态机”对象的可变性。我正在评估Bacon.js's Observable.withStateMachine . 我的领域是交易机器人。我有一个“订单”的源事件流,它实际上
我正在开发一个使用 React 的项目,并且希望实现一种 FRP 形式来处理给定对象以任何给定形式更改时的事件。 我对 Bacon.js 和 RX.js 做了一些研究,但仍然有点不确定如何充分利用这些
今天,我读到了 FRP(函数式响应式(Reactive)编程)。但是,我不知道这在引擎本身中有多少适合。 看完Gerold Meisinger's article ,我的问题是,是否值得使用 FRP
我是一名优秀的程序员,十分优秀!