我是 Elm 新手,一直在查看以下示例(请注意,这是在较新的 0.17 架构下,其中 Action 现在是 Command):http://elm-lang.org/examples/random http://elm-lang.org/examples/random
后续挑战是向示例中添加第二个骰子,以便单击按钮即可为每个骰子滚动一个新值。我的想法是更改模型以保存两个单独的值,每个骰子一个,ala
type alias Model =
{ dieFace1 : Int
, dieFace2 : Int
}
在我到达更新块之前,这一切都很好。我不确定如何更新随机数生成器以创建两个值。该功能对我来说有点混乱。
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)
Random.generate 函数的文档有点简单 -
生成:(a -> msg) -> 生成器 a -> Cmd msg
创建一个将生成随机值的命令。
这是否是处理两个骰子的正确方法,还是有更好的方法?我是一个 elm 菜鸟,请友善:)
Random.int
是一个原始生成器,它为您提供一个随机整数。您需要一个生成器来恰好为您提供两个随机整数。
随机数生成器可以由更原始的生成器构建,以创建更复杂的生成器。幸运的是,Elm 正好有这样的功能,Random.pair http://package.elm-lang.org/packages/elm-lang/core/4.0.0/Random#pair它允许您指定元组的每个部分需要哪两个生成器。
让我们将骰子生成器放入其自己的函数中以避免重复:
dieGenerator : Random.Generator Int
dieGenerator =
Random.int 1 6
现在我们可以构建另一个生成器,它为我们提供一对骰子的随机值:
diePairGenerator : Random.Generator (Int, Int)
diePairGenerator =
Random.pair dieGenerator dieGenerator
由于我们正在处理整数元组,因此让我们更新您的Msg
的定义NewFace Int Int
to NewFaces (Int, Int)
。这将使您的Roll
处理程序要漂亮、干净:
Roll ->
(model, Random.generate NewFaces diePairGenerator)
如果您想尝试超越这一点,请考虑需要什么才能允许滚动任意数量的骰子。采用从更原始的生成器构建复杂生成器的想法,并使用文档Random http://package.elm-lang.org/packages/elm-lang/core/4.0.0/Random模块为我们提供了指南。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)