Xem xét lambda vô nghĩa sau đây:F # mô hình kết hợp kỳ quặc
function
| [] -> "Empty list"
| hd::tl -> "Not so empty list"
này hoạt động tốt. Bây giờ tôi viết lại nó như sau:
function
| [] -> "Empty list"
| hd::tl & l -> "Not so empty list"
Một lần nữa, vì những lý do vô nghĩa (và tôi biết rằng tôi có thể đạt được hiệu quả tương tự bằng cách sử dụng as
thay vì &
, nhưng tất cả điều này đã làm với một vấn đề mã golf đó là không thích hợp với câu hỏi này). Bây giờ trình biên dịch F # cho tôi biết:
cảnh báo FS0025: Mẫu không hoàn chỉnh khớp với biểu thức này. Đối với ví dụ , giá trị '[]' có thể cho biết một trường hợp không được bao gồm trong các mẫu .
Điều này không có ý nghĩa gì - tôi xử lý rõ ràng trường hợp []
trong quy tắc đầu tiên. Tôi không thấy điều gì đã thay đổi từ hàm đầu tiên sang hàm thứ hai liên quan đến []
; quy tắc thứ hai của cả hai chức năng sẽ không khớp với quy tắc thứ hai mà chỉ có chức năng thứ hai đưa ra cảnh báo. Tất cả những gì tôi đã làm là thêm một mẫu bổ sung khớp với mọi thứ.
Tất nhiên, việc gọi hàm thứ hai có danh sách trống sẽ thành công.
Có lý do chính đáng nào tại sao cảnh báo này xảy ra hay không, việc xác thực mẫu F # có đơn giản là có một số câu hỏi không? Tôi có thể thấy có một số trường hợp như thế này khi các mẫu nâng cao hơn được sử dụng, nhưng điều này có vẻ như là một mô hình khá cơ bản. Ngay cả khi vấn đề không thể được giải quyết nói chung, có vẻ như loại trường hợp này sẽ đủ phổ biến để có được sự xử lý đặc biệt trong trình biên dịch.
tôi chưa bao giờ thấy '&' được sử dụng theo cách đó. Bạn có thể liên kết đến một số tài liệu về những gì không? – JaredPar
@JaredPar - xem VÀ mẫu tại đây http://msdn.microsoft.com/en-us/library/dd547125.aspx. Về cơ bản nó có nghĩa là bạn có thể nhận được đầu, đuôi và toàn bộ danh sách trong một đi –