título tienen qué name motor metaetiquetas las keywords impacto etiquetas ejemplos description content búsqueda elm

elm - tienen - ¿Cómo agrego un segundo dado a este ejemplo de efectos de olmo?



seo meta tags (3)

Además de los cambios descritos en la respuesta aceptada por @ChadGilbert, también tuve que cambiar el caso de actualización de NewFaces (usando elm 0.18.0 ).

NewFaces newFaces -> let (newFace1, newFace2) = newFaces in (Model newFace1 newFace2, Cmd.none)

Soy nuevo en Elm y he estado observando el siguiente ejemplo (tenga en cuenta que esto se encuentra en la nueva arquitectura 0.17, donde Action ahora es Command): http://elm-lang.org/examples/random

Hay un desafío de seguimiento para agregar un segundo dado al ejemplo, de modo que un solo clic del botón arroje un nuevo valor para cada dado. Mi idea es cambiar el modelo para mantener dos valores separados, uno para cada dado, ala

type alias Model = { dieFace1 : Int , dieFace2 : Int }

Esto funciona bien hasta que llegue al bloque de actualización. No estoy seguro de cómo actualizar el generador de números aleatorios para crear dos valores. La función es un poco confusa para mí.

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)

La documentación para la función Random.generate es un poco ligera -

generar: (a -> msg) -> Generador a -> Cmd msg

Crea un comando que genere valores aleatorios.

¿Es este incluso el enfoque correcto para manejar dos dados, o hay una mejor manera? Soy un olmo noob, por favor se bueno :)


Un enfoque es usar batch como aquí https://gist.github.com/davidchase/40c27042bccfb00d786af0360b5bc3ea .

Otra es usar Random.pair o Random.list si necesita más de 2:

import Html exposing (..) import Html.App as Html import Html.Events exposing (..) import Html.Attributes exposing (..) import Random main : Program Never main = Html.program { init = init , view = view , update = update , subscriptions = subscriptions } -- MODEL type alias Model = { dieFaces : (List Int) } -- http://.com/questions/23199398/how-do-i-get-a-list-item-by-index-in-elm#comment56252508_23201661 get : Int -> List a -> Maybe a get n xs = List.head (List.drop n xs) -- http://rundis.github.io/blog/2016/elm_maybe.html getOrOne : Int -> List Int -> Int getOrOne n xs = Maybe.withDefault 1 (get n xs) init : (Model, Cmd Msg) init = (Model [1, 1], Cmd.none) -- UPDATE type Msg = Roll | NewFace (List Int) update : Msg -> Model -> (Model, Cmd Msg) update msg model = case msg of Roll -> (model, Random.generate NewFace (Random.list 2 (Random.int 1 6))) NewFace newFace -> (Model newFace, Cmd.none) -- SUBSCRIPTIONS subscriptions : Model -> Sub Msg subscriptions model = Sub.none -- VIEW view : Model -> Html Msg view model = div [] [ img [ src ("/img/Alea_" ++ toString (getOrOne 0 model.dieFaces) ++ ".png")] [] , img [ src ("/img/Alea_" ++ toString (getOrOne 1 model.dieFaces) ++ ".png")] [] , button [ onClick Roll ] [ text "Roll" ] ]

y otro https://github.com/jcollard/random-examples/blob/master/src/Dice.elm


Random.int es un generador primitivo que le da un solo int aleatorio. Necesita un generador que le dé exactamente dos enteros aleatorios.

Se pueden construir generadores de números aleatorios a partir de generadores más primitivos para crear generadores más complejos. Afortunadamente, Elm tiene una función de este tipo, Random.pair , que le permite especificar qué dos generadores desea para cada parte de la tupla.

Vamos a jalar el generador de troquel a su propia función para evitar que nos repitamos:

dieGenerator : Random.Generator Int dieGenerator = Random.int 1 6

Ahora podemos construir otro generador que nos dé el valor aleatorio de un par de dados:

diePairGenerator : Random.Generator (Int, Int) diePairGenerator = Random.pair dieGenerator dieGenerator

Ya que estamos lidiando con una tupla de entradas, actualicemos su definición de Msg de NewFace Int Int a NewFaces (Int, Int) . Eso permitirá que su controlador de Roll sea ​​agradable y limpio:

Roll -> (model, Random.generate NewFaces diePairGenerator)

Si quiere intentar ir más allá de esto, piense en lo que se necesitaría para permitir que se lanzara cualquier número de dados. Tome esta idea de construir generadores complejos a partir de generadores más primitivos y use la documentación para el módulo Random con una guía.