可重置的累加器行为?

时间:2015-06-03 18:26:34

标签: haskell frp reactive-banana

我正试图把我的脑袋包裹在FRP周围,我不确定我做得对。我想从按键事件中建立一个字符串直到输入被按下。按下Enter键后,字符串将被写出,累加器将重置为空字符串。

我有一个事件源,每次按下键盘上的键Char时都会发出ePressed。首先,我将我关心的两种按键分开:

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

现在我知道如何将它们聚集到我想发送的内容中:

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

但我不确定如何“按住”直到输入被按下,或之后如何重置它。什么是正确的,自律的方式?

1 个答案:

答案 0 :(得分:2)

这个想法是eToPrint是两个事件的联合:当你按下字符并按下回车键时。这里有一个例子(反应性香蕉0.8):

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

要“抓住”它,您可以使用Behavior

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

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

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