【问题标题】:how to merge two signals with SampleOn in Elm如何在 Elm 中使用 SampleOn 合并两个信号
【发布时间】:2016-01-13 01:30:32
【问题描述】:

我尝试合并两个信号。一个是 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

显然是错的。

【问题讨论】:

    标签: elm elm-signal


    【解决方案1】:

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

    type Event
      = Click (Int, Int)
      | Space
    

    在您的mergedSignal 中,clickSignal 目前只是检查Mouse.clicks,但根据您的描述和其他示例,我认为您实际上希望它基于positionOnclickSignal,它为您提供@987654328 @,然后使用它,您现在可以像这样填充Click (Int, Int) 事件的(Int, Int) 部分:

    clickSignal =
      map Click positionOnClickSignal
    

    你会注意到我去掉了上面的括号。这对 Elm 来说更惯用,因为 Click 本质上是一个接受一个 (Int, Int) 参数的函数,该参数将从 map 函数传入。它可以很容易地写成这样:

    clickSignal =
      map (\pos -> Click pos) positionOnClickSignal
    

    现在,如果您只是想在屏幕上看到一些调试文本,那么一种快速简便的方法是使用 Graphics.Element 包中的 show。

    import Graphics.Element exposing (show)
    
    main =
      map (show << toString) mergedSignal
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多