如何在Helm中合并信号?

时间:2015-05-31 02:58:22

标签: haskell frp elm

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

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

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

在Helm中实现这一目标的最佳方法是什么?

2 个答案:

答案 0 :(得分:2)

您可以使用Applicative实例组合内容。例如,liftA2 (,)的类型为Signal a -> Signal b -> Signal (a,b)

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

答案 1 :(得分:2)

我认为最好的方法是找出Helm的merge如何用Elerea的东西实现,并用更原始的术语实现timestamp。我担心我无法帮助你,因为我不太了解赫尔姆,我根本不认识埃莉亚。

可以帮助您完全基于Helm的hacky解决方案。您可以使用merge sigL sigR = let tsMerge (t1,v1) (t2,v2) = if t1 >= t2 then v1 else v2 in tsMerge <~ timestamp sigL ~~ timestamp sigR 区分不同的事件和压缩信号:

{{1}}