2017-03-09 42 views
5

Tài liệu Elm không đưa ra ví dụ sử dụng, do đó rất khó để hiểu ý nghĩa của các loại thông số. Ở một số nơi tôi đã nhìn thấy "một" được sử dụng như một định danh đối số, như trong Platform.Cmd:Tài liệu Elm - "a" nghĩa là gì?

map : (a -> msg) -> Cmd a -> Cmd msg 

này có nghĩa là gì? Tôi sẽ sử dụng Cmd.map như thế nào?

Trả lời

4

a là một biến số . Hãy coi nó như một trình giữ chỗ có thể được thay thế bằng bất kỳ loại nào khác. Tuy nhiên, tất cả các lần xuất hiện của a trong một chữ ký loại phải được thay thế bằng cùng loại bê tông.

Vì vậy, nếu map có chữ ký này ...

(a -> msg) -> Cmd a -> Cmd msg 

... Đây sẽ là một thay thế hợp lệ:

(Bool -> MyMessage) -> Cmd Bool -> Cmd MyMessage 

(msg là một loại biến)

.. trong khi đó, đây sẽ là một sự thay thế không chính xác:

(Bool -> MyMessage) -> Cmd MyMessage -> Cmd Bool -- note the mismatched type variables 

Có các biến kiểu cho nhiều sự linh hoạt, vì một hàm chung như map có thể được sử dụng lại với tất cả các loại khác nhau.

5

Dưới đây là một phần của Elm Guide about reading Types Annotations:

> [ "Alice", "Bob" ] 
[ "Alice", "Bob" ] : List String 

> [ 1.0, 8.6, 42.1 ] 
[ 1.0, 8.6, 42.1 ] : List Float 

> [] 
[] : List a 

Trong trường hợp đầu tiên, chúng tôi có một danh sách đầy giá trị String. Trong giây, Danh sách được lấp đầy với các giá trị Float. Trong trường hợp thứ ba, danh sách trống, vì vậy chúng tôi không thực sự biết loại giá trị nào nằm trong danh sách . Vì vậy, các loại Danh sách một nói rằng "Tôi biết tôi có một danh sách, nhưng nó có thể được lấp đầy với bất cứ điều gì". Trường hợp thấp hơn a được gọi là loại biến, có nghĩa là không có ràng buộc trong chương trình của chúng tôi rằng ghim mã này xuống một số loại cụ thể. Nói cách khác, loại có thể thay đổi dựa trên cách nó được sử dụng.

Trong trường hợp đầu tiên, bạn nên chuyển một hàm sẽ có loại biến từ đối số thứ hai và giá trị trả về của loại msg.

+0

Bạn có ý nghĩa gì khi "lấy loại từ đối số thứ hai"? – steel

+0

Đối số thứ hai mà bạn chuyển đến 'Cmd.map' là loại' Cmd a' trong đó 'a' có thể là bất kỳ loại nào khác. Vì vậy, 'một loại' này phải được chấp nhận bởi hàm được chuyển làm đối số đầu tiên. – daniula

+0

Đây là tất cả vẫn còn mờ với tôi. Bạn có thể thêm ví dụ sử dụng không? – steel

2

Tôi nghĩ về nó giống như Java Generics, a là loại chung loại.

Ví dụ: trong java, List <String>java.util.List trong số String s - đây là loại danh sách cụ thể. Bạn cũng có thể xác định các phương thức có chữ ký như List<A> trong đó A là loại chung chung, trong đó A được chuyển vào bằng phương thức gọi. Here is the Java explanation of raw types.

Tương tự, trong Elm, List a, a là bộ giữ chỗ cho loại chung.

+0

'Một loại thô là tên của một lớp chung hoặc giao diện mà không có bất kỳ đối số kiểu' - sẽ không phải là kiểu thô là' List' sau đó? – stholzm

+0

Bạn nói đúng. Tôi đã cố gắng để rút ra song song từ các loại nguyên liệu Java để thay thế khái niệm bạn giải thích, 'giữ chỗ' trong câu trả lời của tôi. – banncee

Các vấn đề liên quan