2017-12-16 13 views
1

私は、このシミュレーションがあります。すべての項目を知らなくても、レコードの項目を削除し

init : (Model, Cmd Msg) 
    init = ({ dog = List Dog }, Cmd.none) 

    type alias Dog = 
     { name : String 
     , age : Int 
     , price : Float 
     , extra = List Extra 
     } 

    type alias Extra = 
     { allergies : List String 
     , wishes : List String 
     } 


    [{ name = "Hot" 
    , age = 1 
    , price = 300.5 
    , extra = [{...}] 
    }, 
    { name = "Dog" 
    , age = 3 
    , price = 150.0 
    , extra = [{...}] 
    }] 

をそして私は、コードの決定部分に、犬の唯一の「エキストラ」を削除する:

[{ name = "Hot" 
, age = 1 
, price = 300.5 
}, 
{ name = "Dog" 
, age = 3 
, price = 150.0 
}] 

Iこれを行うには、リスト全体をマッピングし、「余分な」オカレンスを削除して新しいリストを生成します。

removeExtraOfDogs dogList = 
    (dogList |> List.map (\dog -> 
      { name = dog.name 
      , age = dog.age 
      , price = dog.price 
      } 
     )) 

タイプに何の変数があるかを知らなくても、余分なものを渡すだけでダイナミックになります。

+0

なぜフィールドを削除しようとしていますか?なぜ、 '{name、age、price} 'で新しい型エイリアスを作るだけではないのですか? – naomik

+0

@naomik、私が開発しているプロジェクトでは、1つまたは2つのレコード項目を取るのと同じことをする必要がある+50種類があります。理由:CSV形式でエクスポートする必要があり、「余分な」ものは必要ありません。 –

+1

ElmでJsonのエンコード/デコードを読むことをお勧めします。 Csvをエンコードするのにも同じルールが適用されます - 私はJsonについて読んでほしい。なぜなら、より適切な検索結果を見つける可能性が高いからです。 – naomik

答えて

4

エルムはこの機能を持っていましたが、it was removed a while agoです。しかし、コメントに記述されたユースケースに基づいて、私はあなたがこの機能を必要としないと思っています。代わりに、Elmの拡張可能なレコード機能を使用して、固定されたフィールドセットを含む限り、異なるレコードを関数に渡すことができます。

たとえば、あなたがnameageフィールドを持つ2種類があり、余分な互換性のないフィールドを持つとしましょう:

type alias Foo = { name : String, age : Int, extra : List String } 
type alias Bar = { name : String, age : Int, extra : Int } 

あなたがタイプStringnameフィールドを持つレコードを取り、age関数を定義することができますタイプIntと、余分なフィールドから:

encode : { r | name : String, age : Int } -> String 
encode record = record.name ++ "," ++ toString record.age 

あなたは今Fooとの両方を渡すことができますは両方とも型シグネチャの要件を満たしているため、この関数に渡します。

+0

性能上の理由から、私は古風モードになります(これはすべてのシステムでタイプごとに1回だけ使用する必要があるためです) –

関連する問題