functional-programming - 如何在 Elm 0.15 中获得 keepWhen 行为?

标签 functional-programming frp elm

keepWhen删除了早期版本的 Elm 中的功能。我已经从 0.14 移植了一个 Elm 应用程序,但我一直在试图让它的一部分工作,它正在使用 keepWhen .

所以基本上我正在寻找一个像

keepWhen : Signal Bool -> a -> Signal a -> Signal a

我已经找到
filter : (a -> Bool) -> a -> Signal a -> Signal a

但它并不完全相同,我还没有弄清楚如何让它工作。

最佳答案

答:从实用程序包中导入

最简单的方法是使用 Signal.Extra.keepWhen 来自 signal-extra包裹。
(完全披露:我是作者)

重要的实现细节

请注意,实现并非完全微不足道。这是包中的实现(Signal 模块导入不合格):

keepWhen : Signal Bool -> a -> Signal a -> Signal a
keepWhen boolSig a aSig =
  zip boolSig aSig
  |> sampleOn aSig
  |> keepIf fst (True, a)
  |> map snd

kqr's answer 中版本的重要区别是 sampleOn保留 keepWhen 的输出当 bool 输入更改时更新。两个过滤器的区别在于 keepWhen从 0.14 开始只过滤来自 a 的更新事件。输入,当 bool 输入变为 True 时不对其进行采样.

另一个实现也在signal-extra 中,名称为 sampleWhen 。 .

图表

如果你对大理石图有一点了解,也许 these old diagrams可能会有所帮助。我将在下面发布相关截图。

您阅读这些图表的方式:
  • 时间从左向右流动。
  • 一条线就是一个信号。
  • 该 block 是一个函数,它接受上面的两个信号并产生下面的信号。
  • 每行左边的形状是初始值。
  • 填充形状是信号上的事件。
  • 轮廓形状适用于信号不改变的情况。
  • 我用形状来表示类型。
  • 我使用颜色来表示不同的值。

  • keepWhen and older keepWhen+sample marble diagrams

    请注意,标记为旧行为的第二个图表与 kqr 答案中的代码行为相匹配。

    关于functional-programming - 如何在 Elm 0.15 中获得 keepWhen 行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29870883/

    相关文章:

    elm - Elm 中的通用模式匹配

    scala - 使用案例类显示表达式

    javascript - FP:树木-分别映射,折叠。怎么样?

    functional-programming - 我需要怎么做才能获得付款?

    haskell - 在回合制 ascii 游戏中使用 FRP(尤其是响应式(Reactive)香蕉)是否有意义?

    html - 在没有 no-op 消息的情况下禁用 Elm 表单提交

    elm - 如何访问本地驱动器上的文件?

    algorithm - 层次二叉树遍历的魔法代码——发生了什么?

    haskell - Iteratees和FRP之间有什么联系?

    javascript - 使用 Bacon.js 在容器中列出