Как я могу сравнить случайное число в вязе
Я использую float : Signal a -> Signal Float
генерировать случайное число.
Я хочу сравнить это сгенерированное число с Float
, Как мне это сделать?
main = lift asText ((Random.float (fps 24)) < 0.3)
Это неправильно, сообщение об ошибке:
(Random.float (fps 24)) < 0.3
Expected Type: Bool
Actual Type: Signal.Signal a
1 ответ
Лучший способ отладить подобные вещи - следовать типам. Разбейте каждую часть на отдельный, изучите типы и устраните ошибку типов.
У нас есть несколько вещей здесь:
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 : ???
Отсюда и наша ошибка типа. Мы пытаемся передать сигнал, но (<)
оператор принимает только 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)))
Теперь все типы решают.
Надеюсь это поможет!