hal*_*bra 13

请注意,(:=)从去除Json.Decode从开始0.18.0

中缀运营商

在Elm中,您可以定义自定义中缀运算符,它们存在的目的是提供更易读的代码版本.具有讽刺意味的是,当你不熟悉这个概念时,却恰恰相反.

(:=)是一个自定义中缀运算符,由 Json.Decode包提供.

请考虑以下自定义中缀运算符的示例:

import Html exposing (text)

(<|>) : String -> String -> String
(<|>) beginning end =
  beginning ++ "Bar" ++ end

main =
  text ("Foo" <|> "Buz") -- "FooBarBuz"
Run Code Online (Sandbox Code Playgroud)

强烈建议避免使用自定义中缀运算符.

让我们回到(:=)运算符.

它的类型定义看起来像是(:=) : String -> Decoder a -> Decoder a,我们必须从可用的解码器基元列表中传递一个字符串和一个解码器,并重新运行一个新的解码器,并将一个字符串键映射到它.

本地代码

在JavaScript世界中,解码器是进行类型检查的回调函数.

例如,这是一个解码器字符串基元:

function decodeString(value) {
  if (typeof value === 'string' || value instanceof String) {
    return value;
  }
  crash('a String', value);
}
Run Code Online (Sandbox Code Playgroud)

这是一个等效于(= =)运算符的JavaScript :

function decodeField(field, decoder) {
  return function(value) {
    var subValue = value[field];
    if (subValue !== undefined) {
      return decoder(subValue);
    }
    crash("an object with field '" + field + "'", value);
  };
}
Run Code Online (Sandbox Code Playgroud)

TL; DR

(:=)将字符串键映射到回调(它不是一个回调,但这是你能想到的最接近的),当你将它转换为Elm值时,它将检查JavaScript对象中值的类型.


Seb*_*ian 5

它为json字符串中的给定键创建解码器.

"name" := string
Run Code Online (Sandbox Code Playgroud)

创建一个解码器,用于提取"name"中的值并将其传递给string解码器.