如何在 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 的 Signal
s 是如何根据 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
我正在使用 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 的 Signal
s 是如何根据 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