1

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
4

1 回答 1

2

调试此类事物的最佳方法是遵循类型。将每个部分分成单独的部分,检查类型并解决类型错误。

我们这里有几件事:

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)))

现在,所有类型都解析了。

希望这可以帮助!

于 2014-11-15T12:48:27.273 回答