FRP:如何将一个流中的事件数相乘

时间:2016-04-15 08:56:11

标签: stream functional-programming reactive-cocoa frp

问题很简单,但我无法找到一个好的解决方案。

我们说我有一个流。流只能发送4个事件:A,B,C,D

它可以表示为:

[--A--A----C---B--D--...]

现在考虑一下,每个事件都有其编码值。 例如:

A -> 1, 0, 0, 0
B -> 0, 1, 0, 0
...

现在,问题是:如何使用A,B,C,D事件的编码值转换此流,而不是将每个事件表示为4个事件。

为了使一切清楚,这就是我想要的:

我的流:

[--A--A----C---B--D--...]

我知道:

A -> 1, 0, 0, 0
B -> 0, 1, 0, 0
...

我要制作的信息流:

[--1-0-0-0--1-0-0-0----0-0-1-0---0-1-0-0--0-0-0-1--...]

我能想到的一个解决方案是映射流,为每个事件返回子流,然后展平结果。但我不确定如何在FRP方面实施。

如果我应该使用流的组合,请提供相关示例。 我亲自使用Reactive-Cocoa,但你可以使用任何其他语言回答,它并不重要。

1 个答案:

答案 0 :(得分:1)

我找到了适用于我的解决方案。我对扁平流的猜测非常合理。所以这就是我如何达到预期的结果:

// first producer is SignalProducer<String, NoError>
// which posts events "A", "B", "C", "D"

    let secondProducer = firstProducer.flatMap(.Latest, transform: { value -> SignalProducer<Bool, NoError> in

        let result:[Bool] = ["A" == value, "B" == value,  "C" == value, "D" == value]
        return SignalProducer<Bool, NoError>(values: result)
    })

    secondProducer.startWithNext({value in
        print("value : \(value)")
    })

这里的要点是:我使用flatMap将第一个信号产生器转换为第二个,将A,B,C和D中的每一个编码为Bool的4个信号。

这是Frp的基础知识,但我希望有些初学者能发现它很有用。