Как я могу получить случайное значение в диапазоне, определяемом сигналом?
Сначала немного кода:
import Random
import Window
writeRandom x = lift asText (Random.range 0 x <| every second)
upperLimit = 300
-- upperLimit = Window.width -- How can i use this instead?
main = writeRandom upperLimit
В конечном итоге я пытаюсь получить случайные точки на экране, но я не могу понять, как передать Window.height и Window.width в Random.range. Я не думаю, что смогу "поднять" Random.range, так как он уже возвращает сигнал. Если я пытаюсь получить ошибку типа:
Type Error: 'main' must have type Element or (Signal Element).
Instead 'main' has type:
Signal (Signal Element)
И я не уверен, что противоположность лифта (ниже?) Существует, или даже имеет смысл.
Спасибо
1 ответ
Вы правы, полагая, что противоположность низшему не имеет смысла.
В данном конкретном случае встроенная библиотека Random является встроенной, поскольку она является оболочкой для собственного вызова JavaScript. Это причина Signal
тип возврата, чтобы сохранить код в чистоте. И даже тогда он не совсем хорошо себя ведет.
Чтобы получить нужный вам случайный диапазон, вам понадобится другой генератор случайных чисел. Существует общественная библиотека, которая была опубликована всего несколько дней назад и, вероятно, будет отвечать вашим потребностям. Вы можете проверить это в GitHub самостоятельно или использовать elm-get
инструмент.
Ваш код станет чем-то вроде (не проверено!):
import Window
import Generator
import Generator.Standard as GStd
randomSeed = 12346789
writeRandom : Signal Int -> Signal Element
writeRandom x =
let update high (_, gen) = Generator.int32Range (0,high) gen
start = (0, GStd.generator randomSeed)
input = sampleOn (every second) x
result = fst <~ foldp update start input
in lift asText result
upperLimit = Window.width
main = writeRandom upperLimit
В writeRandom
, ты используешь foldp
сохранить последний генератор случайных чисел. В update
Вы используете это, чтобы получить новое случайное число и новый генератор в следующий раз. Ввод x
обновляется каждую секунду с помощью sampleOn (every second)
, fst <~
часть состоит в том, чтобы удалить генератор случайных чисел, так как вы хотите только случайное число.