【问题标题】:Resettable accumulator behaviors?可复位的累加器行为?
【发布时间】:2015-06-03 18:26:34
【问题描述】:

我正试图围绕 FRP 进行思考,但我不确定我是否做得对。我想从按键事件建立一个字符串,直到按下输入。一旦按下回车,字符串被写出,累加器被重置为空字符串。

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

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

现在我知道如何将它们组合成我要发送的内容:

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

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

【问题讨论】:

    标签: haskell frp reactive-banana


    【解决方案1】:

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

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

    要“持有”它,您可以使用Behavior


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

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

    行为bString 包含累积的String 值。只要eEnter 事件发生,eOut 事件就会返回最后一个字符串值。特别注意accumB 的语义:在eEnter 发生的那一刻,bString 的值仍然是 值。

    【讨论】:

    • 作为 FRP 上最好的资源之一,也是反应性香蕉上最好的资源之一,您能详细说明一下吗?如果是,+1!
    • @ErikAllik 喜欢这个吗?
    猜你喜欢
    • 2020-08-11
    • 2019-06-29
    • 1970-01-01
    • 2013-05-29
    • 2019-08-07
    • 1970-01-01
    • 2018-09-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多