2011-12-15 11 views

Trả lời

16

Các lính canh là when phần. Trình biên dịch nói với bạn điều gì là nó không thể biết liệu trận đấu của bạn có đầy đủ hay không (bao gồm tất cả các trường hợp có thể), nhưng điều đó có thể không xảy ra. Trình biên dịch thực sự không thể biết chắc chắn, bởi vì sự thiếu hụt là không thể xác định cho các biểu thức tùy ý. Trình biên dịch chỉ là số liệu bạn nên có ít nhất một mẫu mà không cần bảo vệ bởi vì khi trận đấu là đầy đủ, một người bảo vệ trong trường hợp cuối cùng sẽ là dư thừa.

Vì bạn biết khớp của bạn là đầy đủ, trình biên dịch về cơ bản là đúng. Bảo vệ thứ hai của bạn là dư thừa. Bạn chỉ có thể bỏ qua nó mà không có sự khác biệt về ý nghĩa:

match z with 
| y when List.length z = 0 -> ... 
| y -> ... 

Điều này sẽ làm cho trình biên dịch hài lòng.

Tôi thích cảnh báo này; nó đã tìm thấy một vài lỗi logic cho tôi trong những năm qua.

Nếu mã này không chỉ là một ví dụ nhưng thực sự những gì bạn đã viết là, nó sẽ được nhiều hơn thành ngữ để viết nó như thế này:

match z with 
| [] -> ... 
| head :: tail -> ... 

Nó cũng là một chút hiệu quả hơn vì nó đã giành' t bận tâm để tính toán độ dài của danh sách và sau đó loại bỏ kết quả.

Nếu bạn không cần phải destructure danh sách, bạn có thể làm cho nó đơn giản hơn vẫn:

if z = [] then 
    ... 
else 
    ... 
+0

Cảm ơn Jeffrey. Bạn thực sự đã xóa mọi thứ và giúp tôi học cách viết mã sạch hơn (đặc biệt với các câu lệnh if). :) – Aspen