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

标签 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

显然,这是错误的。

最佳答案

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

type Event
  = Click (Int, Int)
  | Space

在你的 mergedSignal 里面, clickSignal目前正在检查 Mouse.clicks但根据您的描述和其他示例,我认为您实际上希望它基于 positionOnclickSignal ,它给你一个 Signal (Int, Int) ,并使用它,您现在可以填充 (Int, Int) Click (Int, Int) 的一部分像这样的事件:

clickSignal =
  map Click positionOnClickSignal

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

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

现在,如果你只是想在屏幕上看到一些调试文本,一个快速简单的方法是使用 show来自 Graphics.Element包。

import Graphics.Element exposing (show)

main =
  map (show << toString) mergedSignal

这会给你一些调试文本作为页面上唯一显示的内容,你可以很容易地把它扔到 http://elm-lang.org/try 上。用于测试。

关于elm - 如何在 Elm 中使用 SampleOn 合并两个信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34756928/

相关文章:

elm - 无法读取未定义的属性 'kids' - 或者如何打破 Elm 中信号的循环依赖关系?

node.js - 在 Centos 6.9 上安装 Elm

arrays - elm:使用 foldr 展平列表或数组

elm - 对包含可能 Time.Posix 的对象列表进行排序

haskell - 如何在 Helm 中合并信号?

Elm:两个键盘键一起发出信号?

elm - 如何获取Elm中信号的当前值?

Elm - 如何根据另一个信号修改一个信号的参数化