2016-03-31 32 views
0

işlemek için aşağıdaki işlev belirli bir konumda bir şeklin içinde olup olmadığını belirler: Fare pozisyonları beslendiğindeElm - nasıl tipi Sinyal Bool

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) 

olan bu fare, şekil olup olmadığını hesaplamak (bir dikdörtgen bölge ile yaklaşık) bölge:

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

burada (width, height) ve (sX, sY) tip Signal.Signal (Float, Float) vardır. Buradaki sorun, yukarıdaki ifadenin döndürülen değeri Signal Bool tipindedir - bu, if gibi koşullu işlevlere nasıl eklenebilir? Yalnızca Bool türlerini kabul ederler.

Burada eksik olduğum en iyi uygulama var mı?

cevap

1

Sinyal tarafından tutulan değeri işlemek için Signal.map kullanmanız gerekir. Kod snippet'iniz zaten Signal.map3 ile yapılıyor (buna üç farklı sinyal parametresini kabul ettiği için map3 deniyor).

Signal.map'u kullandığınızda, eşleme işlevinizin Sinyallerle uğraşması gerekmez. Durumdaki örnek: inPosInShape fonksiyonunuz, Signals'a saygı duymadan temel öğelerle ilgilenir. Eğer isPosInShape tarafından üretilen sinyal ile bir şeyler yapmak istiyorsanız

nedenle, Signal.map kullanabilir ve Bool kabul eder ve başka bir şeye dönüşüyor bir işlev sağlamak gerekir.

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 
:

Burada tip Signal Bool ait Keyboard.space sinyalinden boolean, üzerinde hareket tamamen zoraki örnek