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

Сначала немного кода:

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 <~ часть состоит в том, чтобы удалить генератор случайных чисел, так как вы хотите только случайное число.

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