解码Elm中的可扩展记录

时间:2017-12-18 20:38:05

标签: decode elm

我一直在elm中使用可扩展记录(0.18)。我的模型包含以下类型:

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首选,但我想知道是否还有另一种方式)

1 个答案:

答案 0 :(得分:7)

遗憾的是,可扩展记录目前(从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
        ...