【问题标题】:What exactly does the := operator do in Elm?:= 运算符在 Elm 中究竟做了什么?
【发布时间】:2016-07-22 19:34:10
【问题描述】:

这是来自文档的一个不清楚的示例,使用此运算符:http://package.elm-lang.org/packages/elm-lang/core/3.0.0/Json-Decode#at

【问题讨论】:

  • 请解释您不明白的地方或不工作的地方。我投票结束这个问题,因为不清楚你在问什么
  • 哇,所有的回复都清楚了。非常感谢大家。我无法理解这个运算符是特定于 Json.Decode 包的,我认为它来自核心。

标签: operators elm colon-equals


【解决方案1】:

它需要一个您正在操作的字典的键,并尝试使用解码器解码在那里找到的内容,例如任何内置的,甚至是您自己的自定义解码器。

本质上是单一访问at

at ["name"] string

等于:

"name" := string

【讨论】:

    【解决方案2】:

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

    "name" := string
    

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

    【讨论】:

      【解决方案3】:

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

      中缀运算符

      在 Elm 中,你可以定义自定义的infix operators,它们存在的目的是为了提供更易读的代码版本。具有讽刺意味的是,当你不熟悉这个概念时,它会适得其反。

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

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

      import Html exposing (text)
      
      (<|>) : String -> String -> String
      (<|>) beginning end =
        beginning ++ "Bar" ++ end
      
      main =
        text ("Foo" <|> "Buz") -- "FooBarBuz"
      

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

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

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

      本机代码

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

      例如,这里是一个解码器字符串原语:

      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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-06-18
        • 2012-07-23
        • 2016-09-10
        • 2023-03-15
        • 2012-10-17
        • 2021-06-04
        • 1970-01-01
        相关资源
        最近更新 更多