2017-01-25 22 views
6

Trước tiên tôi mới sử dụng f #, vì vậy có thể câu trả lời là hiển nhiên, nhưng tôi không thấy nó. Vì vậy, tôi có một số tuples với một id, và một giá trị. Tôi biết id mà tôi đang tìm kiếm và tôi muốn chọn tuple chính xác trong số ba mà tôi đang đi vào. Tôi sẽ làm điều này với hai câu lệnh khớp nhau được lồng vào nhau, nhưng mọi thứ đều phù hợp với quy tắc đầu tiên. Đối với ví dụ này tôi cắt nó xuống hai bộ dữ liệu vì điều này cho thấy vấn đề của tôi. Trình biên dịch đưa ra một "quy tắc sẽ không bao giờ được xuất hiện" cảnh báo, nhưng tôi không thấy lý do tại sao.Kết hợp mẫu F # với quy tắc tuples sẽ không bao giờ được đối sánh

let selectTuple tupleId tuple1 tuple2 = 
    match tuple1 with 
    | (tupleId, _) -> tuple1 
    | _ -> tuple2 

Mọi trợ giúp hoặc đề xuất về cách tốt hơn để làm điều này sẽ được đánh giá cao.

Trả lời

6

Sử dụng một điều khoản when:

let selectTuple tupleId tuple1 tuple2 = 
    match tuple1 with 
    | (x, _) when x = tupleId -> tuple1 
    | _ -> tuple2 

gì đang xảy ra ở đây là khi bạn sử dụng tupleId như một phần của vụ án phù hợp, bạn giới thiệu một giá trị mới gọi tupleId mà bạn có thể tham khảo ở phía bên phải của trường hợp phù hợp. Điều này làm đổ bóng đối số hàm của bạn.

Vì bạn chỉ có thể đặt tên cho phần tử đầu tiên của một bộ tuple, bất kỳ bộ túp nào sẽ khớp với trường hợp đầu tiên và đó là cách bạn nhận được 'quy tắc sẽ không được đối sánh' trên cảnh thứ hai.

+0

Tuyệt vời, cảm ơn rất nhiều! Bây giờ tôi nhìn thấy nó, nó làm cho cảm giác hoàn hảo, là biểu thức phù hợp cũng làm ràng buộc. – Jesse

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