2016-06-22 17 views
17

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à:

  1. là giải thích của tôi có đúng không?
  2. 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?

Trả lời

8

Cách diễn giải của bạn là chính xác.

Bằng cách giữ ra các hành động cho This đầu tiên và thứ hai That bạn đang tạo một mẫu HOẶC như mô tả trong Pattern Matching (F#)

Đối với tôi đây là một chút bối rối, cũng vậy, kể từ khi logic 'hoặc' là || trong F #. Và trong khi nó rất dễ dàng để xem thanh tịnh như new alternative và thanh thứ hai như or trong định dạng của bạn nó trở nên ít rõ ràng trong

let useThing = 
    function 
    | This 
    | That -> "A" 
    | That 
    | Other -> "B" 

Tuy nhiên trình biên dịch có thể biết được một mô hình toàn bộ là vô ích nhưng nó không thể đơn giản hóa một mô hình . That | Other có đối sánh hợp lệ và do đó không thừa khi được trình biên dịch xem xét.
Bạn có thể nghĩ đến nhiều mô hình liên quan hơn, ở đó không rõ ràng nếu các bộ phận có thể bị bỏ sót hoặc cách đơn giản hóa chúng.

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