可重置的累加器行为?
Resettable accumulator behaviors?
我正在尝试全神贯注于 FRP,但不确定自己是否做对了。我想从按键事件建立一个字符串,直到按下回车。按下回车键后,字符串将被写出,累加器将重置为空字符串。
我有一个事件源,每次按下键盘上的键时都会发出 Char
,ePressed
。首先我把我关心的两种按键分离出来:
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 值。
我正在尝试全神贯注于 FRP,但不确定自己是否做对了。我想从按键事件建立一个字符串,直到按下回车。按下回车键后,字符串将被写出,累加器将重置为空字符串。
我有一个事件源,每次按下键盘上的键时都会发出 Char
,ePressed
。首先我把我关心的两种按键分离出来:
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 值。