以下是来自文档的一个不太清晰的示例,使用此运算符:http://package.elm-lang.org/packages/elm-lang/core/3.0.0/Json-Decode#at
(注:该链接为英文网页)以下是来自文档的一个不太清晰的示例,使用此运算符:http://package.elm-lang.org/packages/elm-lang/core/3.0.0/Json-Decode#at
(注:该链接为英文网页)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 值时检查值的类型。
"name" := string
创建一个解码器,提取“name”中的值并将其传递给string
解码器。
at ["name"] string
等于:
"name" := string