我是Elm的新手并且一直在查看以下示例(请注意,这是在较新的0.17架构下,其中Action现在是Command):http: //elm-lang.org/examples/random
在示例中添加第二个骰子有一个后续挑战,因此只需单击该按钮就会为每个骰子滚动一个新值.我的想法是改变模型以保持两个单独的值,每个模具一个,ala
type alias Model =
{ dieFace1 : Int
, dieFace2 : Int
}
Run Code Online (Sandbox Code Playgroud)
这工作正常,直到我到达更新块.我不知道如何更新随机数生成器来创建两个值.这个功能对我来说有点混乱.
type Msg
= Roll
| NewFace Int Int
update : Msg -> Model -> (Model, Cmd Msg)
update msg model =
case msg of
Roll ->
**(model, Random.generate NewFace (Random.int 1 6))** <-- not sure what to do here
NewFace newFace1 newFace2 ->
(Model newFace1 newFace2, Cmd.none)
Run Code Online (Sandbox Code Playgroud)
Random.generate函数的文档有点轻 -
生成:(a - > msg) - >生成器a - > Cmd msg
创建一个将生成随机值的命令.
这甚至是处理两个骰子的正确方法,还是有更好的方法?我是榆树诺布,请你好:)
Cha*_*ert 17
Random.int是一个原始生成器,它为您提供单个随机int.你需要一个生成器,它给你两个随机整数.
随机数生成器可以从更原始的生成器构建,以创建更复杂的生成器.幸运的是,Elm只有这样一个函数,Random.pair它允许你为元组的每个部分指定你想要的两个生成器.
让我们将模具生成器拉入自己的功能,以避免重复:
dieGenerator : Random.Generator Int
dieGenerator =
Random.int 1 6
Run Code Online (Sandbox Code Playgroud)
现在我们可以构建另一个生成器,它为我们提供一对die的随机值:
diePairGenerator : Random.Generator (Int, Int)
diePairGenerator =
Random.pair dieGenerator dieGenerator
Run Code Online (Sandbox Code Playgroud)
因为我们正在处理的整数的元组,让我们更新Msg的定义NewFace Int Int来NewFaces (Int, Int).这将使您的Roll处理程序变得干净整洁:
Roll ->
(model, Random.generate NewFaces diePairGenerator)
Run Code Online (Sandbox Code Playgroud)
如果您想尝试超越这一点,请考虑允许卷起任意数量的模具所需的内容.采用从更原始的生成器构建复杂生成器的想法,并使用Random模块的文档作为指南.