如何在 Helm 中合并信号?

How do I merge signals in Helm?

我正在使用 Helm 开发一个基于 Elm 语言的项目。

我需要根据一对信号中哪个信号先到达来触发一个事件。在 Elm 中,我会使用 merge 函数,但我在 Helm 中找不到等效函数。我看到的最接近的是组合(在信号库中),它似乎没有做我想做的。似乎 combine 只需要一个信号列表并将它们直接变成列表的信号,这不是我正在寻找的。

编辑:具体来说,我正在寻找一个带有签名 Signal a -> Signal a -> Signal a 的函数,它接收第一个信号并丢弃第二个信号。

在 Helm 中完成此任务的最佳方法是什么?

您可以使用 Applicative 实例组合事物。例如 liftA2 (,) 将具有类型 Signal a -> Signal b -> Signal (a,b).

(不过,我不是 100% 确定这是否是你的问题。如果你的问题是关于 Event a -> Event a -> Event a 之类的合并事件,我不确定 helm 是否具有这样的功能。我只能找到具有连续语义的类行为 Signal 的文档。)

我认为最好的方法是找出 Helm 的 Signals 是如何根据 Elerea 的东西实现的,并用那些更原始的术语实现 merge。恐怕在这方面我帮不了你,因为我不太了解 Helm,而且我根本不了解 Elerea。

可以 帮助您提供完全基于 Helm 的 hacky 解决方案。您可以使用 timestamp 来区分压缩信号中的不同事件:

merge sigL sigR =
  let
    tsMerge (t1,v1) (t2,v2) =
        if t1 >= t2
          then v1
          else v2
  in
    tsMerge <~ timestamp sigL ~~ timestamp sigR