2012-04-12 27 views
6

Tôi đang cố gắng để có được đầu của tôi xung quanh các công đoàn bị phân biệt và các loại hồ sơ; cụ thể cách kết hợp chúng để có thể đọc được tối đa. Đây là một ví dụ - nói rằng một đội thể thao có thể có điểm (cả hai điểm giải đấu và chênh lệch mục tiêu), hoặc nó có thể bị đình chỉ khỏi giải đấu trong trường hợp nó không có điểm hoặc chênh lệch mục tiêu. Dưới đây là cách tôi đã cố gắng thể hiện rằng:Kết hợp các tổ chức phân biệt đối xử với các loại bản ghi

type Points = { LeaguePoints : int; GoalDifference : int } 

type TeamState = 
    | CurrentPoints of Points 
    | Suspended 

type Team = { Name : string; State : TeamState } 

let points = { LeaguePoints = 20; GoalDifference = 3 } 

let portsmouth = { Name = "Portsmouth"; State = points } 

Sự cố xảy ra ở cuối dòng cuối cùng, nơi tôi nói 'State = points'. Tôi nhận được 'Expression được dự kiến ​​sẽ có loại TeamState nhưng ở đây có loại điểm'. Làm thế nào để tôi có được xung quanh đó?

Trả lời

5
let portsmouth = { Name = "Portsmouth"; State = CurrentPoints points } 
+0

Bạn đẹp! Cảm ơn pad. – Kit

+0

(Sẽ đánh dấu là câu trả lời khi được phép - 6 phút!) – Kit

15

Để thêm một số chi tiết để trả lời pad của, lý do tại sao phiên bản ban đầu của bạn không làm việc là các loại giá trị được gán cho State phải là một giá trị hợp kỳ thị kiểu TeamState. Trong biểu hiện của bạn:

let portsmouth = { Name = "Portsmouth"; State = points } 

... loại pointsPoints. Trong phiên bản được đăng bởi pad, biểu thức CurrentPoints points sử dụng một hàm tạo của TeamState để tạo ra một giá trị công đoàn phân biệt đối xử đại diện cho CurrentPoints. Các tùy chọn khác mà đoàn mang đến cho bạn là Suspended, có thể được sử dụng như thế này:

let portsmouth = { Name = "Portsmouth"; State = CurrentPoints points } 
let portsmouth = { Name = "Portsmouth"; State = Suspended } 

Nếu bạn không sử dụng tên của các nhà xây dựng, sau đó nó không phải là rõ ràng như thế nào bạn muốn xây dựng một đội ngũ lơ lửng!

Cuối cùng, bạn cũng có thể viết tất cả mọi thứ trên chỉ là một dòng duy nhất, nhưng đó không phải là có thể đọc được:

let portsmouth = 
    { Name = "Portsmouth" 
    State = CurrentPoints { LeaguePoints = 20; GoalDifference = 3 } } 
+1

Cảm ơn bạn đã xây dựng Tomas :-) – Kit

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