如何在Elm中使用SampleOn合并两个信号

时间:2016-01-13 01:30:33

标签: elm elm-signal

我尝试合并两个信号。一个是Mouse.clicks,另一个是Keyboard.space。

  • 点击后,我应该从Mouse.position获取一个Signal(Int,Int)作为返回值
  • 在太空中,我应该得到一些不同的东西,这样我才能识别出不同的信号被触发。

我的想法是:

type Event = Click | Space

mergedSignal : Signal Event
mergedSignal = 
  let
    clickSignal = map (\event -> Click) Mouse.clicks
    timeoutSignal = map (\event -> Space) Keyboard.space
  in
    merge clickSignal timeoutSignal

并以某种方式获得位置:

positionOnClickSignal:Signal (Int,Int)
positionOnClickSignal = sampleOn Mouse.clicks Mouse.position

显然,这是错误的。

1 个答案:

答案 0 :(得分:4)

听起来您希望鼠标位置作为事件的一部分继续存在。在这种情况下,您可以将Event重新定义为

type Event
  = Click (Int, Int)
  | Space

mergedSignal内,clickSignal目前正在检查Mouse.clicks,但根据您的说明和其他示例,我认为您实际上希望以{{1}为基础},它为您提供positionOnclickSignal,并使用它,您现在可以填充Signal (Int, Int)事件的(Int, Int)部分,如下所示:

Click (Int, Int)

你会注意到我在上面取出了括号。这对于Elm来说更为惯用,因为clickSignal = map Click positionOnClickSignal 本质上是一个函数,它接受一个Click参数,该参数将从map函数传入。它可以很容易地写成:

(Int, Int)

现在,如果你只是想在屏幕上看到这个调试文本,那么快速简单的方法就是使用clickSignal = map (\pos -> Click pos) positionOnClickSignal 包中的show。< / p>

Graphics.Element

这将为您提供一些显示为页面上唯一内容的调试文本,您可以轻松地将其放在http://elm-lang.org/try上进行测试。