如何在 Elm 中使用 SampleOn 合并两个信号
how to merge two signals with SampleOn in Elm
我尝试合并两个信号。一个是 Mouse.clicks,另一个是 Keyboard.space。
- 点击时,我应该从 Mouse.position 得到一个 Signal(Int,Int) 作为 return 值
- 在 space,我应该得到一些不同的东西,这样我就可以识别不同的信号被触发了。
我的想法是:
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)
,使用它,你现在可以像这样填充 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 上进行测试。
我尝试合并两个信号。一个是 Mouse.clicks,另一个是 Keyboard.space。
- 点击时,我应该从 Mouse.position 得到一个 Signal(Int,Int) 作为 return 值
- 在 space,我应该得到一些不同的东西,这样我就可以识别不同的信号被触发了。
我的想法是:
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)
,使用它,你现在可以像这样填充 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 上进行测试。