Как я могу сравнить случайное число в вязе

Я использую 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)))

Теперь все типы решают.

Надеюсь это поможет!

Другие вопросы по тегам