2017-07-27 21 views
0

Elm versuchen zu lernen, und es ist ziemlich schwer :)Elm: ein Datensatz mit Liste bevölkern Werte

Was ich versuche zu erreichen: ein Modell

Ich habe das mit einer Reihe von Schlüsseln ein Rekord ist Wertpaare. Ich möchte diese Schlüssel mit Werten aus einer Liste von Zeichenfolgen füllen.

module Main exposing (..) 
import List 
import Html exposing (Html, program, div, text) 

type alias Model = 
    { one: String 
    , two: String 
    , three: String 
    } 

fakeData: List String 
fakeData = ["foo", "bar", "baz", "bad", "baf"] 

populate: Model -> List String -> Model 
populate model data = 
    case List.head data of 
     Just str -> 
      case model.one of 
       "" -> 
        let updatedModel = 
         { model | one = str } 
        in 
         case List.tail data of 
          Just items -> 
           populate updatedModel items 
          Nothing -> 
           model 
       _ -> 
        case model.two of 
         "" -> 
          let updatedModel = 
           { model | two = str } 
          in 
           case List.tail data of 
            Just items -> 
             populate updatedModel items 
            Nothing -> 
             model 
         _ -> 
          case model.three of 
           "" -> 
            let updatedModel = 
             { model | three = str } 
            in 
             case List.tail data of 
              Just items -> 
               populate updatedModel items 
              Nothing -> 
               model 
           _ -> 
            model 
     Nothing -> 
      model 


init: (Model, Cmd Msg) 
init = 
    (populate { one = "", two = "", three = "" } fakeData, Cmd.none) 

type Msg = 
    NoOp 

view: Model -> Html Msg 
view model = 
    div [] 
     [ text (toString model) ] 

update: Msg -> Model -> (Model, Cmd Msg) 
update msg model = 
    case msg of 
     NoOp -> 
      (model, Cmd.none) 

subscriptions: Model -> Sub Msg 
subscriptions model = 
    Sub.none 

main: Program Never Model Msg 
main = 
    program 
    { init = init 
    , view = view 
    , update = update 
    , subscriptions = subscriptions 
    } 

Dieses Programm druckt:

{ one = "foo", two = "bar", three = "baz" } 

Ich glaube, ich eine harte Zeit, herauszufinden, wie dieser Code machen weniger repetitive und einfacher über die Vernunft. Was passiert, wenn ich 20 Schlüssel im Modell habe, die alle ausgefüllt werden müssen? Der obige Code würde ziemlich verrückt werden.

+0

@ chadgilbert Antwort (wie immer) ist sehr gut. Um es etwas genauer auszudrücken: In Elm sind Datensätze nicht wirklich zum Iterieren gedacht. In der Regel, wenn Ihr Code in Elm wirklich langgezogen wird, ist dies ein Zeichen, dass etwas anderes vorgeht (vielleicht ein anderer Typ). Es lohnt sich, den "Dict" -Typ in Elm zu betrachten. Die Verwendung eines solchen in Ihrem Modell kann die Arbeit erleichtern. – wintvelt

Antwort

2

Sie können Pattern-Matching auf der Liste verwenden statt:

populate : Model -> List String -> Model 
populate model data = 
    case data of 
     one :: two :: three :: _ -> 
      { model | one = one, two = two, three = three } 

     _ -> 
      model 
+0

Ohh! Das ist ziemlich süß, danke. – mylvinta