可重置的累加器行为?

Resettable accumulator behaviors?

我正在尝试全神贯注于 FRP,但不确定自己是否做对了。我想从按键事件建立一个字符串,直到按下回车。按下回车键后,字符串将被写出,累加器将重置为空字符串。

我有一个事件源,每次按下键盘上的键时都会发出 CharePressed。首先我把我关心的两种按键分离出来:

eWritable = filterE (`elem` ['A'..'z']) ePressed
eEnter = filterE (== '\n') ePressed

现在我知道如何将它们聚集在一起成为我要发送的内容了:

eToPrint = accumE "" (fmap (:) eWritable)

但我不确定如何 "hold on to" 在按下回车键之前,或者之后如何重置它。什么是正确的、惯用的方法来解决这个问题?

这个想法是 eToPrint 是两个事件的联合:当您按下字符时和当您按下回车键时。这里有一个例子(reactive-banana 0.8):

eToPrint = accumE "" $ unions [(:) <$> eWritable, const "" <$> eEnter]

要"hold"呢,可以用Behavior.


这是一个完整的解决方案:

bString = accumB "" $ unions [(:) <$> eWritable, const "" <$> eEnter]
eOut    = bString <@ eEnter

行为 bString 包含累积的 String 值。 eOut 事件 returns 每当 eEnter 事件发生时的最后一个字符串值。请特别注意 accumB 的语义:在 eEnter 发生的时刻,bString 的值仍然是 old 值。