首先是一些代码:
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)
而且我不确定升力的反面(较低?)是否存在,甚至是否有意义。
由于
答案 0 :(得分:3)
你认为与较低的相反没有意义是正确的
在这种特殊情况下,内置随机库是内置的,因为它是本机JavaScript调用的包装器。这是Signal
返回类型的原因,以保持代码纯。即便如此,它还是not completely well-behaved。
要获得所需的随机范围,您需要一个不同的随机数生成器。有一个community library仅在几天前发布,可能会满足您的需求。您可以自行查看GitHub,或use 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 <~
部分是删除随机数生成器,因为您只需要随机数。