2

首先是一些代码:

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)

而且我不确定升力的反面(更低?)是否存在,甚至是否有意义。

谢谢

4

1 回答 1

3

您认为 lower 的对立面没有意义是正确的。
在这种特殊情况下,内置的 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 <~部分是删除随机数生成器,因为您只需要随机数。

于 2014-01-27T12:45:23.727 回答