2017-05-04 22 views
5

Tôi đang gặp một số vấn đề trong đầu quanh các loại công đoàn trong elm. Tôi hiểu trường hợp sử dụng đơn giản nhưTìm hiểu các loại hình công đoàn elm

type Visibility = All | Active | Completed 

Điều đó có nghĩa là giá trị của Visiblity có thể là Tất cả, Hoạt động hoặc Đã hoàn tất. Càng xa càng tốt. Tuy nhiên, tôi bị nhầm lẫn là

type Msg 
    = OnFetchMails (WebData (List Mail)) 
    | OnFetchSmss (WebData (List SMS)) 

Tôi nên giải thích điều này như thế nào? Điều đó có nghĩa là Msg có thể thuộc loại OnFetchMails có chức năng loại WebData có danh sách thư không? Hoặc làm thế nào tôi nên giải thích điều này? Tôi không nghĩ rằng (WebData (List Mail)) là trọng tải?

vui đủ tôi có thể lấy nó để làm việc mà không hiểu nó

Trả lời

6

Trên thực tế, có, bạn có thể nghĩ về nó như một tải trọng mà đi cùng với từng ngành.

type Msg 
    = OnFetchMails (WebData (List Mail)) 
    | OnFetchSmss (WebData (List SMS)) 

Có nghĩa là một giá trị kiểu Msg có thể là OnFetchMails, sẽ có một số giá trị của loại WebData (List Mail) để đi với nó; hoặc có thể là OnFetchSmss với một số WebData (List SMS) đi kèm.

Họ đôi khi được gọi tagged đoàn, vì chúng hoạt động rất giống một C-style union xây dựng kèm với một giá trị thẻ mà nói mà tùy chọn trong liên minh là một trong những hiện hợp lệ (và trong thực tế nhiều ngôn ngữ với loại cấu trúc này để thực hiện chúng theo cách đó).

Chúng cũng có thể được mô hình hóa dưới dạng một loạt các lớp con của loại cơ sở trừu tượng Msg, thêm dung lượng cho tải trọng của chúng trong mỗi phân lớp và yêu cầu tải trọng được cung cấp dưới dạng tham số hàm tạo.

8

Khi xác định loại công đoàn, bạn liệt kê tất cả các cách để tạo giá trị của loại đó. Ở dạng đơn giản nhất, định nghĩa đó trông như thế này:

type Visibility 
    = All 
    | Active 
    | Completed 

Như bạn đã phỏng đoán, đây tuyên bố kiểu Visibility và xác định ba giá trị, tất cả các loại Visibility. Cách duy nhất để xây dựng một giá trị kiểu Visibility là sử dụng một trong ba tùy chọn này. Do đó, chúng ta thường gọi chúng là "các nhà xây dựng".

Đây là một chút phức tạp hơn định nghĩa kiểu công đoàn:

type TrainStatus 
    = OnTime 
    | Delayed Int 

Như bạn mong đợi, điều này định nghĩa hai mới "nhà thầu," OnTimeDelayed. Nhưng hãy xem các loại của chúng:

OnTime : TrainStatus 
Delayed : Int -> TrainStatus 

Hàm tạo OnTime không có đối số và chỉ đơn giản là giá trị; nó đã là TrainStatus. Nhưng Delayed được khai báo là một hàm tạo một đối số: đó là hàm tạo mới TrainStatus trong số Int. Như vậy, Delayed 5, Delayed 10Delayed 100 đều có giá trị TrainStatus giá trị. (Chúng tôi có thể giải thích chúng là "bị trì hoãn 5 phút" hoặc tương tự.)

Một hàm tạo có thể thực hiện nhiều đối số; ví dụ: nếu chúng tôi muốn bao gồm, dưới dạng Chuỗi, lý do cho sự chậm trễ:

type TrainStatus 
    = OnTime 
    | Delayed Int String 

ts : TrainStatus 
ts = Delayed 20 "The conductor took a short nap." 

xác định Delayed : Int -> String -> TrainStatus.

Nếu bạn đang đưa ra một TrainStatus, bạn có thể trích xuất các IntString bên trong của nó sử dụng kết hợp mẫu:

case ts of 
    OnTime -> 
    "Your train is on time!" 

    Delayed minutes reason -> 
    "Your train has been delayed by " ++ toString minutes ++ " because " ++ reason 
Các vấn đề liên quan