2017-07-27 1 views
0

値、そしてそれはかなり難しい:)エルム:リストでレコードを投入すると、エルムを学ぼうと

私が達成しようとしているもの:

私は、キーの数を持つレコードのモデルを持っています値のペア。私はそれらのキーに文字列のリストから値を入力したい。

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 
    } 

このプログラムは、プリントアウトし:

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

私はつらい時、このコードは以下の繰り返しとについて推論しやすいようにする方法を考え出すを持っていると思います。モデルにすべて20個のキーが必要な場合はどうなりますか?上記のコードはかなり狂気になるでしょう。

+0

@。ビットを詳しく説明する:Elmでは、レコードは実際に反復することを意図していません。通常、あなたのコードがElmで実際に長時間待たされるとき、それは他の何かが起こっているというサイン(おそらく別のタイプ)です。 Elmの 'Dict'タイプを見てみる価値はあります。モデルの中の1つを使用すると、作業が楽になる場合があります。 – wintvelt

答えて

2

代わりに、リスト上のパターンマッチングを使用することができます。chadgilbertの答えは(いつものように)非常に良いです

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

     _ -> 
      model 
+0

ああ!それはかなり甘い、ありがとう。 – mylvinta

関連する問題