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可能会有所帮助。我将在下面发布相关截图。
您阅读这些图表的方式:
请注意,标记为旧行为的第二个图表与 kqr 答案中的代码行为相匹配。
关于functional-programming - 如何在 Elm 0.15 中获得 keepWhen 行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29870883/