Elm Colon Equals Operator

jab*_*jab 1 elm colon-equals

在尝试解码较大的json值时,我遇到了Json-Decode-Extra库中的以下代码.(位于这里)

import Date (Date)

type alias User =
  { id                : Int
  , createdAt         : Date
  , updatedAt         : Date
  , deletedAt         : Maybe Date
  , username          : Maybe String
  , email             : Maybe String
  , fullname          : Maybe String
  , avatar            : Maybe String
  , isModerator       : Bool
  , isOrganization    : Bool
  , isAdmin           : Bool
  }

metaDecoder : (Int -> Date -> Date -> Maybe Date -> b) -> Decoder b
metaDecoder f = f
  `map`      ("id"        := int)
  `apply` ("createdAt" := date)
  `apply` ("updatedAt" := date)
  `apply` ("deletedAt" := maybe date)

userDecoder : Decoder User
userDecoder = metaDecoder User
  `apply` ("username"          := maybe string)
  `apply` ("email"             := maybe string)
  `apply` ("fullname"          := maybe string)
  `apply` ("avatar"            := maybe string)
  `apply` ("isModerator"       := bool)
  `apply` ("isOrganization"    := bool)
  `apply` ("isAdmin"           := bool)
Run Code Online (Sandbox Code Playgroud)

但是,我经常遇到:=运算符的编译错误.这定义在哪里?JSON解码教程不会在任何地方显式导入此运算符.

Cha*_*ert 5

在Elm 0.18中,:=运算符被替换为Json.Decode.field,并且使用了用于中缀运算符的反引号.

您正在使用尚未更新为Elm 0.18的软件包(circuithub/elm-json-extra).

考虑切换到使用由Elm社区维护的包:elm-community/json-extra.你可以用andMap而不是apply.以下是升级到新库和Elm 0.18的示例代码:

import Date exposing (Date)
import Json.Decode exposing (..)
import Json.Decode.Extra exposing (andMap, date)

metaDecoder : (Int -> Date -> Date -> Maybe Date -> b) -> Decoder b
metaDecoder f =
    succeed f
        |> andMap (field "id" int)
        |> andMap (field "createdAt" date)
        |> andMap (field "updatedAt" date)
        |> andMap (field "deletedAt" (maybe date))

userDecoder : Decoder User
userDecoder =
    metaDecoder User
        |> andMap (field "username" (maybe string))
        |> andMap (field "email" (maybe string))
        |> andMap (field "fullname" (maybe string))
        |> andMap (field "avatar" (maybe string))
        |> andMap (field "isModerator" bool)
        |> andMap (field "isOrganization" bool)
        |> andMap (field "isAdmin" bool)
Run Code Online (Sandbox Code Playgroud)

请注意,该elm-community/json-extra包还会导出一个中缀运算符|:,它是一个中缀版本andMap.您可以使用它来使您的代码更简洁.例如:

metaDecoder : (Int -> Date -> Date -> Maybe Date -> b) -> Decoder b
metaDecoder f =
    succeed f
        |: field "id" int
        |: field "createdAt" date
        |: field "updatedAt" date
        |: field "deletedAt" (maybe date)
Run Code Online (Sandbox Code Playgroud)