我 float : Signal a -> Signal Float
用来生成随机数。
我想将此生成的数字与 a 进行比较Float
,我该怎么做?
main = lift asText ((Random.float (fps 24)) < 0.3)
这是错误的,错误信息:
(Random.float (fps 24)) < 0.3
Expected Type: Bool
Actual Type: Signal.Signal a
调试此类事物的最佳方法是遵循类型。将每个部分分成单独的部分,检查类型并解决类型错误。
我们这里有几件事:
lift : (a -> b) -> Signal a -> Signal b
asText : a -> Element
Random.float : Signal a -> Signal Float
fps : number -> Signal Time
(<) : number -> number -> Bool
好的,让我们开始插入值并解析类型:
fps 24 : Signal Time
Random.float (fps 24) : Signal Float
(Random.float (fps 24)) < 0.3 : ???
这就是我们的类型错误的来源。我们试图传入一个 Signal 但(<)
操作员只接受number
. 所以,我们真正想要的是一个比较我们中的值的函数,Signal
看看它是否是< 0.3
.
foo : Float -> Bool
foo n = n < 0.3
现在,我们可以将foo
信号提升并传递给它:
lift foo (Random.float (fps 24))
然后将其插入到我们原来的表达式中:
main = list asText (lift foo (Random.float (fps 24)))
现在,所有类型都解析了。
希望这可以帮助!