2016-04-03 16 views
6

は、この演算子を使用して、ドキュメントから不明確例です:http://package.elm-lang.org/packages/elm-lang/core/3.0.0/Json-Decode#atエルムでは:=演算子は正確に何をしますか?ここで

+0

あなたが理解できないことやうまくいかないことを説明してください。私はあなたが何を求めているかわからない*この質問を閉じるために投票しています* – Druzion

+1

すべての返事の後、うわあ、それはすべて明らかです。みんなに感謝します。私はこの演算子がJson.Decodeパッケージに固有であることを理解できませんでした。私はそれがコアから始まったと考えました。 –

答えて

10

はその(:=)0.18.0

中置演算子

エルムで

から始まるJson.Decodeから削除されていないしてください、あなたはカスタムinfix operatorsを定義することができ、その存在の目的は、コードのより読みやすいバージョンを提供するためのものです。皮肉なことに、コンセプトに慣れていないときは、それは逆です。

(:=)は、Json.Decodeパッケージによって提供されるカスタム中置演算子です。

は、カスタム中置演算子の次の例を考えてみてください:

import Html exposing (text) 

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

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

非常に独自の中置演算子の使用を避けることをお勧めします。

オペレータ(:=)に戻りましょう。

それは我々が利用可能Decoder Primitivesのリストから、文字列やデコーダーを渡す必要があること、を意味し、それにマッピングされた文字列キーで、新しいデコーダを再実行(:=) : String -> Decoder a -> Decoder a、のように見えるために型定義。 JavaScriptの世界では

ネイティブコード

、デコーダは型チェックを行うコールバック関数です。

例えば、ここではプリミティブデコーダStringです:

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デコーダに渡しデコーダを作成します。

関連する問題