2012-09-01 26 views
25

Nói rằng tôi có trường hợp đơn phân biệt đối xử liên minh sau:ngắn gọn mô hình phù hợp trên trường hợp duy nhất bị kỳ thị công đoàn trong F #

type OrderId = OrderId of string 

Tại một số điểm tôi cần chuỗi thực tế. Cách tôi đã tìm thấy để trích xuất nó là:

let id = match orderId with OrderId x -> x 

Có cách nào ngắn gọn hơn để thực hiện việc này không?

Tôi hiểu rằng việc sử dụng của tôi là một trường hợp đặc biệt và phù hợp với các ý nghĩa để chắc chắn rằng bạn đã bao gồm các khả năng, chỉ cần tự hỏi nếu có một cách để làm điều gì đó như:

let OrderId id = orderId 

Trả lời

37

Bạn' gần như ở đó. Ngoặc đơn là cần thiết để mà trình biên dịch giải thích một let-bound như khớp mẫu:

let (OrderId id) = orderId 

Nếu orderId là một tham số của một hàm, bạn cũng có thể sử dụng mô hình kết hợp trực tiếp có:

let extractId (OrderId id) = id 
18

Khi bạn đang sử dụng một công đoàn phân biệt để giữ một giá trị duy nhất (đó là một kỹ thuật lập trình F # hữu ích), thì có thể xác định nó bằng thuộc tính để truy cập giá trị:

type OrderId = 
    | OrderId of string 
    member x.Value = let (OrderId v) = x in v 

Việc triển khai Value đang sử dụng kết hợp mẫu bằng cách sử dụng let như được đăng bởi pad. Bây giờ, nếu bạn có một giá trị orderId loại OrderId, bạn có thể chỉ cần viết:

let id = orderId.Value 

Tuy nhiên, mô hình phù hợp với sử dụng (OrderId id) vẫn còn khá hữu ích, bởi vì truy cập bất động sản sẽ chỉ làm việc khi trình biên dịch đã biết các loại orderId (vì vậy bạn thường sẽ sử dụng đối sánh mẫu trong đối số hàm, nhưng quyền truy cập thuộc tính cho các giá trị khác).

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