2016-01-13 41 views
3

我嘗試合併兩個信號。一個是Mouse.clicks,另一個是Keyboard.space。如何合併Elm中的SampleOn的兩個信號

  • 的點擊,我應該得到Mouse.position的信號(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 

很顯然,這是錯誤的。

回答

4

聽起來好像你希望鼠標位置作爲事件的一部分繼續。在這種情況下,你可以重新定義Event作爲

type Event 
    = Click (Int, Int) 
    | Space 

裏面你mergedSignal,則clickSignal目前只是檢查Mouse.clicks,但根據您的描述和其他例子,我想你真正想要的是將基於關閉positionOnclickSignal,這給你一個Signal (Int, Int),並利用這一點,你現在可以填充Click (Int, Int)事件這樣的0​​部分:

clickSignal = 
    map Click positionOnClickSignal 

你會注意到,我在上面拿出括號。這對於Elm來說更具慣用性,因爲Click本質上是一個函數,它接受一個(Int, Int)參數,該參數將從map函數傳入。它可以很容易地被寫成這樣:現在

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

,如果你只是想在屏幕上看到的這一些調試文本,一個快速簡便的方式去那就是使用showGraphics.Element包。

import Graphics.Element exposing (show) 

main = 
    map (show << toString) mergedSignal 

這會給你顯示爲頁面上的唯一一些調試的文字,你可以很容易地折騰起來的http://elm-lang.org/try進行測試。