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

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

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)

И я не уверен, что противоположность подъему (ниже?) существует или даже имеет смысл.

Спасибо


person Matimus    schedule 26.01.2014    source источник


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

person Apanatshka    schedule 27.01.2014
comment
Спасибо за ответ. Я попробую это в ближайшее время. - person Matimus; 27.01.2014
comment
Оно работает. Мне потребовалось несколько дней, чтобы настроить среду для ее тестирования. - person Matimus; 31.01.2014