Tôi gặp phải một sự kỳ quặc trong cú pháp khớp mẫu F # ngày hôm nay, điều này có thể dẫn đến thất bại rõ ràng trong việc kiểm tra độ rộng.Sự mơ hồ trong cú pháp khớp mẫu
type Thing =
| This
| That
| Other
let useThing =
function
| This -> "A"
| That -> "A"
| That -> "B" // compiler complains
| Other -> "B"
Trong trường hợp trên, trình biên dịch sẽ cho tôi biết nguyên tắc thứ hai sẽ không bao giờ khớp. Tuy nhiên, nếu tôi đã cố gắng làm cho mã nhỏ gọn hơn một chút và đã viết
let useThing =
function
| This | That -> "A"
| That | Other -> "B"
Tôi không nhận được bất kỳ trợ giúp nào từ trình biên dịch. Tôi nghĩ rằng lý do là | This | That ->. "A"
không phải là lối tắt cho | This -> "A" | That -> "A"
, mặc dù nó trông rất giống với nó (và tôi đã thấy nhiều mẫu mã xử lý như vậy). Thay vào đó, từ những gì tôi có thể tìm thấy, biểu tượng đường ống được sử dụng để tách riêng các mẫu riêng lẻ và cũng như dạng OR.
Đây không phải là vấn đề lớn đối với hầu hết DU, nhưng tôi gặp vấn đề khi ánh xạ DU với số lượng lớn trường hợp vào DU khác với một số ít trường hợp. Nỗ lực của tôi để sử dụng cú pháp phím tắt gây ra lỗi.
Vì vậy, câu hỏi của tôi là:
- là giải thích của tôi có đúng không?
- Có cách nào khác ngoài việc liệt kê từng mẫu trên một dòng riêng biệt không?