2017-12-18 13 views
1

私はelm(0.18)で拡張可能なレコードを使用しています。私のモデルには次のタイプが含まれています:Elmの拡張可能なレコードのデコード

type alias Cat c = 
    { c 
     | color : String 
     , age : Int 
     , name : String 
     , breed : String 
    } 

type alias SimpleCat = 
    Cat {} 

type alias FeralCat = 
    Cat 
     { feral : Bool 
     , spayed : Bool 
     } 

今、これらのタイプをデコーダに渡すことができます。私は通常、elm-decode-pipelineライブラリ"NoRedInk/elm-decode-pipeline": "3.0.0 <= v < 4.0.0"を使用します。

私はこのタイプの設定:

catDecoder : Decode.Decoder SimpleCat 
catDecoder = 
    Pipeline.decode SimpleCat 
    |> Pipeline.required "color" Decode.string 
    |> Pipeline.required "age" Decode.int 
    |> Pipeline.required "name" Decode.string 
    |> Pipeline.required "breed" Decode.string 

をしかし、私はこのエラーを取得する:

-- NAMING ERROR --------------------------------------------- ./src/Decoders.elm 

Cannot find variable `SimpleCat` 

141|  Pipeline.decode SimpleCat 

これは私の非伸縮タイプでは発生しません。これらのタイプをデコーダで使用する方法はありますか? (elm-decode-pipelineが好きですが、別の方法があるかどうかを知りたいのですが)

答えて

4

拡張可能なレコードは残念ながら現在のところ(Elm 0.18では)エイリアス名をコンストラクタとして使用して作成できません。代わりに、独自のコンストラクタ関数を書くことができます:

simpleCatConstructor : String -> Int -> String -> String -> SimpleCat 
simpleCatConstructor color age name breed = 
    { color = color, age = age, name = name, breed = breed } 

次にあなたがdecodeへの呼び出しであること置き換えることができます:

catDecoder = 
    Pipeline.decode simpleCatConstructor 
     |> Pipeline.required "color" Decode.string 
     ... 
+0

私はそれを恐れていました。これらのすべてのタイプのデコーダが必要であると仮定すると、そのテクニックは(拡張性のない)レコードを作成するだけのメリットがありますか? –

+1

/Elmがコンストラクタとして拡張可能な形式で定義された型を使用できるようになるまでは、 'Cat a'エイリアスとまだ一致しているので、' FeralCat'の定義のすべてのプロパティをリストする方が良いかもしれません –

関連する問題