2017-12-07 12 views
1

私はこのタイプエルム:更新値のサブタイプで

私は通常、獲物

let 
    newCat = 
    (Cat 
     (Head oldValue.eyes oldValue.nose 
     (Mouth 
      (Prey oldValue.left 1) 
     ) 
    ) 
    ) 
in 
({model | cat = newCat }, Cmd.none) 
の右側を変更するためにこれをやっている値

cat : Cat 
cat = 
    { head = 
    { eyes = 2 
    , nose = 1 
    , mouth = 
     { tongue = 1 
     , prey = 
     { left = 1 
     , right = 1 
     } 
     } 
    } 
    } 

を挿入

type alias Cat = 
{ head : Head 
} 

type alias Head = 
    { eyes : Int 
    , nose : Int 
    , mouth : Mouth 
    } 

type alias Mouth = 
    { tongue : Int 
    , prey : Prey 
    } 

type alias Prey = 
    { left : Int 
    , right : Int 
    } 

を持っています

そして私はそれを打つことが嫌いですが、私は正しい方法でそれを行う方法を把握することはできません。私はそれを正しくしようとすると、私は 'タイプの猫'を返すことはできません。

正しい獲物を正しい方法で変更するにはどうすればよいですか?

答えて

5

あなたはすでに正しい方法でやっています。

ネストされたレコードを扱うときは、すでに行っているように、ネストしたレコードを構築する必要があります。

ここでは、抽象newCatを実行して、Int -> Cat -> Catの機能に変換します。その後、あなたはできるでしょう({model | cat = updateRightPrey 1 model.cat }, Cmd.none)

しかし、正直なところ、あなたのデータモデルを再検討したいかもしれません。 Head,MouthPreyは実際に値を提供していますか?あなたが緩んで(と何を獲得しなければならない)あなたはこのようなあなたのモデルを平ら場合でしょう:あなたがタイプにすべてのそれらのIntタイプの別名を変更しても

type alias Cat = 
    { eyes : Eyes 
    , nose : Nose 
    , tongue : Tongue 
    , left : Prey 
    , right : Prey 
    } 

type alias Eyes = Int 
type alias Nose = Int 
type alias Tongue = Int 
type alias Prey = Int 

...

type Eyes = Eyes Int 

​​

か...

..それは、ネストされたレコードを扱うよりもずっと簡単になります