【发布时间】:2013-06-28 17:04:48
【问题描述】:
我正在尝试了解如何使以下 zip 函数(尤其是调用函数)更具功能性。我遇到的问题是调用方法必须等待左侧和右侧都被填充,然后才能分派值。必须按顺序调用这些值,以便压缩正确的值,否则我会考虑使用 curry/partial 函数来实现这一点。
有什么我可以使用的东西可以消除这种障碍。
function zip(state, a, b) {
var left = [];
var right = [];
function invoke() {
if (left.length > 0 && right.length > 0) {
state([left.shift(), right.shift()]);
}
}
a.foreach(function(v) {
left.push(v);
invoke();
});
b.foreach(function(v) {
right.push(v);
invoke();
});
}
Bellow 是满足 zip 功能的简单示例。
function Stream() {
var env = this;
env.subs = [];
env.id = setInterval(function() {
env.subs.forEach(function(f) {
f(Math.random());
});
}, ((Math.random() * 100) + 500) | 0);
}
Stream.prototype.foreach = function(f) {
this.subs.push(f);
}
zip(function(v) {
console.log(v);
}, new Stream(), new Stream());
奖励:删除可变数组。
【问题讨论】:
-
所以
a和b将拥有带有异步回调的forEach方法,这就是我们所知道的吗?还是应该让zip更通用? -
我认为你想要
shift方法而不是unshift方法。unshift方法将元素添加到数组的开头。shift方法删除数组开头的第一个元素。 -
确实,实际的实现确实是
zip(new Stream(), new Stream()).forEach(function(v) { console.log(v); });,但对于实际问题,这个细节只是关于如何让这个实际的 zip 函数运行。 -
我还修复了 shift 与 unshift (当我输入问题时出现错字 - 好地方!)。 @Bergi 它确实是关于异步回调,我实际上想知道是否有一些来自 Haskell(etc) 或类别理论的东西我可以实现合并或共享状态。
-
另一个不相关的实现错误:您的 Stream 为每个订阅者提供不同的随机数
标签: javascript functional-programming frp