在 Elm 中,":=" 运算符具体的作用是什么?

7

请解释您不理解或无法正常工作的部分。我投票关闭此问题,原因是不清楚您在询问什么 - Kaspar Lee
1
哇,经过所有回复后,一切都清楚了。非常感谢大家。我之前不明白这个运算符是特定于Json.Decode包的,我以为它来自核心。 - yevt
3个回答

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

中缀运算符

在Elm中,您可以定义自定义中缀运算符,它们的存在目的是为了提供更易读的代码版本。具有讽刺意味的是,当您不熟悉该概念时,它会产生相反的效果。

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

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

import Html exposing (text)

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

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

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

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

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

本地代码

在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);
  };
}

简述

(:=) 将一个字符串键映射到一个回调函数(不完全是回调函数,但这是最接近的描述),该函数将在将 JavaScript 对象转换为 Elm 值时检查值的类型。


5
它在一个JSON字符串中创建给定键的解码器。
"name" := string

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


3
它需要一个字典的键,并尝试使用解码器对其中找到的内容进行解码,可以使用任何内置的解码器或自定义的解码器。基本上它就是单个访问“at”。
at ["name"] string

等于:

"name" := string

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接