Here's an answer that works with 0.15 [EDIT: and 0.16], currently the latest version of Elm. Since Joe's answer was written, the Random library has been overhauled completely to use a pure random number generator. The pseudorandom numbers are deterministic: every run is always the same, unless you change the initial seed.
我们从导入开始:无聊但必要,然后使用 Random 库定义一些常量。
import Graphics.Element exposing (flow, down, show, Element)
import Time exposing (fps)
import Random
gen = Random.int 0 100
gen2 = Random.pair gen gen
seed0 = Random.initialSeed 42
接下来我们定义一个状态类型,包含随机种子和要显示的数字。我以为我们想要两个;对于恒定长度的列表,请使用Random.list n gen
。我们还使用记录构造函数语法(和两个“随机”数字)定义初始状态。
type alias State = {seed : Random.Seed, first : Int, second : Int}
state0 = State seed0 36 89
现在我们定义一个每秒运行一次的步进函数。在这里,我们剥离两个随机数并将它们与新种子一起存储。请注意,我们每次都使用一个新的种子,将一个种子链接到下一个种子。
step : a -> State -> State
step _ state =
let
((first, second), seed') = Random.generate gen2 state.seed
in
State seed' first second
现在我们使用foldp
引入状态,实际运行该步骤函数。
state : Signal State
state = Signal.foldp step state0 (fps 1)
我们定义一个纯渲染函数。这里没有信号。
render : State -> Element
render state =
flow down [show state.first, show state.second]
最后,我们将渲染函数映射(以前称为提升)到状态。
main = Signal.map render state
如果您连接灰色框并删除间隙注释,您将获得一个可以运行的 Elm 0.15 程序。但请注意,它似乎是 CPU 密集型的。