我正试图把我的脑袋包裹在FRP周围,我不确定我做得对。我想从按键事件中建立一个字符串直到输入被按下。按下Enter键后,字符串将被写出,累加器将重置为空字符串。
我有一个事件源,每次按下键盘上的键Char
时都会发出ePressed
。首先,我将我关心的两种按键分开:
eWritable = filterE (`elem` ['A'..'z']) ePressed
eEnter = filterE (== '\n') ePressed
现在我知道如何将它们聚集到我想发送的内容中:
eToPrint = accumE "" (fmap (:) eWritable)
但我不确定如何“按住”直到输入被按下,或之后如何重置它。什么是正确的,自律的方式?
答案 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
的值仍然是旧值。