以下函数确定给定位置是否在形状内:
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
种类型。
我在这里缺少最佳做法吗?
答案 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