3

我正试图把头绕在 FRP 上,但我不确定我做对了。我想从按键事件建立一个字符串,直到按下输入。一旦按下回车,字符串就会被写出并且累加器被重置为空字符串。

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

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

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

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

但是我不确定如何“坚持”直到按下输入,或者之后如何重置它。什么是正确的,惯用的方式来解决这个问题?

4

1 回答 1

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仍然是值。

于 2015-06-04T14:41:46.980 回答