2016-04-03 44 views

回答

10

请不是(:=)Json.Decode0.18.0

缀运算符

在榆树开始删除,你可以自定义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,这意味着,我们必须通过一个String和解码器,从可用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

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

3

它需要一个密钥你在操作字典和尝试解码什么在那里发现了解码器,如任何内置的那些的甚至你自己定制的。

它本质上是一个访问at

at ["name"] string 

等于:

"name" := string 
5

它创建了一个JSON字符串给定键的解码器。

"name" := string 

创建一个在“名称”中提取的值,并把它传递给解码器string一个解码器。