2016-03-31 62 views
0

下面的函數確定一個給定的位置是否是形狀內:榆樹 - 如何處理類型信號布爾

isPosInShape: (Int,Int) -> (Float,Float) -> (Float,Float) -> Bool 
isPosInShape (posX, posY) (w, h) (shapeX, shapeY) = 
    let 
    (pX,pY) = 
     (toFloat posX, toFloat posY) 
    in 
    (pX > shapeX - w/2) && (pX < shapeX + w/2) && (pY > shapeY - h/2) && (pY < shapeY + h/2) 

饋送鼠標位置時,這可以計算鼠標是否是在一個形狀區域(由矩形區域近似):

Signal.map3 isPosInShape Mouse.position (width, height) (sX, sY) 

其中(width, height)(sX, sY)Signal.Signal (Float, Float)類型。

這裏的問題是,上述表達式的返回值是Signal Bool類型 - 如何將其輸入條件函數if? 他們只接受Bool類型。

有沒有我在這裏失蹤的最佳做法?

回答

1

您需要使用Signal.map來處理信號所持有的值。你的代碼片段已經做到了Signal.map3(它被稱爲map3,因爲它接受三個不同的信號參數)。

當您使用Signal.map時,您的映射函數根本不需要處理信號。例如:您的inPosInShape函數處理原語而不考慮信號。

因此,如果您想對isPosInShape生成的信號執行某些操作,則需要使用Signal.map,並提供接受Bool並將其轉換爲其他內容的功能。

下面是作用於從Keyboard.space信號的布爾,這是Signal Bool類型的完全人爲的例子:

import Graphics.Element exposing (show) 
import Keyboard 

doSomething : Bool -> String 
doSomething b = 
    if b then 
    "The spacebar is pressed!" 
    else 
    "Please press the spacebar!" 

main = Signal.map (show << doSomething) Keyboard.space