2016-04-03 20 views
6

Dưới đây là một ví dụ rõ ràng từ tài liệu, sử dụng toán tử này: http://package.elm-lang.org/packages/elm-lang/core/3.0.0/Json-Decode#atChính xác thì toán tử = = làm gì trong Elm?

+0

Vui lòng giải thích những gì bạn không hiểu hoặc những gì không hoạt động.Tôi đang bỏ phiếu để đóng câu hỏi này là * Không rõ những gì bạn đang yêu cầu * – Druzion

+1

Wow, sau tất cả các câu trả lời Tất cả đều rõ ràng. Rất cám ơn tất cả mọi người. Tôi không thể hiểu rằng nhà điều hành này là cụ thể cho gói Json.Decode, tôi nghĩ rằng nó xuất phát từ cốt lõi. –

Trả lời

10

Xin lưu ý rằng (:=) được lấy ra từ Json.Decode bắt đầu từ 0.18.0

khai thác Infix

Trong Elm, bạn có thể xác định tùy chỉnh infix operators, mục đích của sự tồn tại của họ là để cung cấp một phiên bản dễ đọc hơn của mã này. Trớ trêu thay, khi bạn không quen thuộc với khái niệm, nó ngược lại.

(:=) là toán tử tùy chỉnh, được cung cấp bởi gói Json.Decode.

Hãy xem xét ví dụ sau đây của một nhà điều hành tùy chỉnh ghi vào:

import Html exposing (text) 

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

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

Nó là rất khuyến khích để tránh việc sử dụng các nhà khai thác tùy chỉnh ghi vào.

Hãy quay lại nhà cung cấp (:=).

Định nghĩa kiểu cho nó trông giống như (:=) : String -> Decoder a -> Decoder a, có nghĩa là chúng ta phải chuyển một chuỗi và bộ giải mã, từ danh sách có sẵn Decoder Primitives và chạy lại bộ giải mã mới, với khóa chuỗi được ánh xạ tới nó.

Mã gốc

Trong thế giới JavaScript, Bộ giải mã là chức năng gọi lại kiểm tra loại.

Ví dụ, đây là một String Decoder Primitive:

function decodeString(value) { 
    if (typeof value === 'string' || value instanceof String) { 
    return value; 
    } 
    crash('a String', value); 
} 

Và đây là một tương đương JavaScript của (:=) điều hành:

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

(:=) bản đồ một phím chuỗi một cuộc gọi lại (nó không chính xác gọi lại, nhưng đó là gần nhất bạn có thể nghĩ đến), mà sẽ kiểm tra loại giá trị trong đối tượng JavaScript, khi bạn con vert nó vào giá trị Elm.

3

Phải mất một chìa khóa cho từ điển bạn đang hoạt động trên và cố gắng để giải mã những gì tìm thấy ở đó với một bộ giải mã, chẳng hạn như bất kỳ việc xây dựng trong những hoặc thậm chí là tùy chỉnh của riêng bạn.

Về bản chất, nó là một truy cập đơn at.

at ["name"] string 

là tương đương với:

"name" := string 
5

Nó tạo ra một bộ giải mã cho phím được đưa ra trong một chuỗi json.

"name" := string 

Tạo bộ giải mã trích xuất giá trị trong "tên" và chuyển nó tới bộ giải mã string.