如何在 Elm 中随机生成一对花车?

How can I randomly generate a pair of floats in Elm?

我正在尝试创建一个 Random.Generator (Float, Float),其中第一个 Float 在某个范围内,比如说 0.0 1000.0,第二个在 0.0 和第一个值。

有效值示例:(12.0, 5.0) 无效:(303.0, 800.0)

我查看了 Random.Extra 模块中的代码,但找不到解决方法。

下面的示例甚至无法编译。 :)

tuple = 
  let range = float 0.0 500.0
  in flatMap (\max -> (max, float 0.0 max)) range

生成器代码如下:

floatTuple : Random.Generator (Float, Float)
floatTuple =
    Random.float 0.0 1000.0 
    `Random.andThen`
    (\val1 -> Random.map ((,) val1) (Random.float 0 val1))

以下是您如何使用它(在 0.17 中):

(tuple, nextSeed) = Random.step floatTuple initialSeed

您需要使用 Random.andThen

这是一个完整的工作示例(您可以将其复制并粘贴到 http://elm-lang.org/try

import Html exposing (..)
import Html.App as App

import Random exposing (Generator, generate, float, map, andThen) 
import Time exposing (every, second) 

myPair : Float -> Float -> Generator (Float, Float) 
myPair min max =
  let 
    range = float min max 
  in 
    range 
    `andThen` (\f -> map ((,) f) (float min f)) 


type Msg = Request | Update (Float, Float) 

update msg model = 
  case msg of 
    Request -> model ! [generate Update (myPair 0 1000)]
    Update pair -> pair ! []


view model = text (toString model) 


main =
  App.program 
    { init = (0,0) ! []
    , update = update 
    , view = view 
    , subscriptions = (\_ -> every (2*second) (always Request))
    }