榆树的运营商到底做了什么?

时间:2016-04-03 07:22:03

标签: operators elm colon-equals

以下是使用此运算符的文档中不明确的示例:http://package.elm-lang.org/packages/elm-lang/core/3.0.0/Json-Decode#at

3 个答案:

答案 0 :(得分:13)

请注意(:=)已从0.18.0开始Json.Decode移除

中缀运营商

在Elm中,您可以定义自定义infix operators,它们存在的目的是提供更易读的代码版本。具有讽刺意味的是,当你不熟悉这个概念时,情况正好相反。

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

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

import Html exposing (text)

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

main =
  text ("Foo" <|> "Buz") -- "FooBarBuz"

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

让我们回到(:=)运营商。

它的类型定义看起来像(:=) : String -> Decoder a -> Decoder a,这意味着我们必须从可用的Decoder Primitives列表中传递一个字符串和一个解码器,然后用一个字符串键重新运行一个新的解码器映射到它。

原生代码

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

例如,这是一个Decoder String Primitive:

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

这是一个等同于(:=)运算符的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);
  };
}

TL; DR

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

答案 1 :(得分:5)

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

"name" := string

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

答案 2 :(得分:3)

它会为您正在操作的词典提供一个键,并尝试使用解码器解码那里的内容,例如任何内置的词典,甚至是您自己的自定义词典。

它本质上是一次访问at

at ["name"] string

等于:

"name" := string