榆树 - 如何处理类型信号布尔

时间:2016-03-31 12:29:34

标签: types signals mouse elm

以下函数确定给定位置是否在形状内:

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 个答案:

答案 0 :(得分: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