【问题标题】:FRP: How to multiply the number of events in one streamFRP:如何将一个流中的事件数相乘
【发布时间】:2016-04-15 08:56:10
【问题描述】:

这个问题很简单,但我想不出一个好的解决方案。

假设我有一个流。流只能发送 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,但您可以使用任何其他语言回答,没关系。

【问题讨论】:

    标签: stream functional-programming reactive-cocoa frp


    【解决方案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中的每一个编码为4个Bool信号。

    这是Frp的基础知识,希望对初学者有用。

    【讨论】:

      猜你喜欢
      • 2014-07-02
      • 1970-01-01
      • 2016-04-18
      • 1970-01-01
      • 1970-01-01
      • 2013-01-17
      • 2020-03-18
      • 2021-01-03
      • 1970-01-01
      相关资源
      最近更新 更多