2017-09-15 27 views
8

Mã này biên dịch tốt trong F # cũng như OCaml:Tại sao biểu thức F #/OCaml "match" này lại biên dịch?

let testmatch k = 
    match k with 
    | jqk3jtl23jtlk123 -> true 

Tôi đã thử nghiệm trong cả hai FSI và utop. Nó luôn trả về true.

jqk3jtl23jtlk123 hoàn toàn ngẫu nhiên và loại được suy ra là 'a. Thậm chí nếu tôi hạn chế k với một kiểu dữ liệu (ví dụ let testmatch (k: int) =) nó biên dịch (mặc dù rõ ràng là hạn chế testmatch 's loại để int -> bool thay vì 'a -> bool

thể ai đó hãy giải thích những gì đang xảy ra Cụ thể:.?

  • tại sao trình biên dịch chấp nhận một chữ cái hoàn toàn ngẫu nhiên là jqk3jtl23jtlk123?
  • tại sao tôi không nhận được cảnh báo kết hợp vô tận?
  • khớp thực sự là gì?
+7

Bạn không khớp với giá trị 'jqk3jtl23jtlk123', bạn đang tạo giá trị có tên' jqk3jtl23jtlk123' khớp với bất kỳ 'k' nào. – Marth

+2

Trong những ngôn ngữ này, bạn thường hoặc là trong một biểu thức giá trị hoặc một biểu thức phù hợp với mô hình, và hai hành vi này khác nhau. Việc khớp mẫu xảy ra sau 'match ... with', sau' function', và trong bất kỳ tham số hàm/phương thức nào. – TheQuickBrownFox

Trả lời

15

Trong trường hợp này, "chữ" jqk3jtl23jtlk123 là tên biến hợp lệ và do đó, mẫu ở bên trái của -> mô tả giống như khi bạn viết let jqk3jtl23jtlk123 = k. Vì điều này chấp nhận bất kỳ giá trị k và không hạn chế loại của nó vì ràng buộc hoạt động cho tất cả các loại, loại được phỏng đoán là 'a, giá trị chung nhất mà hệ thống kiểu có thể đại diện.

Nếu bạn biến chữ cái thành thứ gì đó không phải là số nhận dạng hợp lệ, ví dụ như bắt đầu bằng chữ số, nó sẽ không biên dịch được.

Nếu bạn bọc chữ bằng dấu ngoặc kép, nó sẽ được hiểu là giá trị chuỗi ký tự, bạn sẽ nhận được cảnh báo trận đấu vô tận, và nó sẽ hạn chế kiểu của k thành string.

9

Đây là mẫu ký tự đại diện có tên là k bằng. Điều này tương đương với

let testmatch k = 
    let jqk3jtl23jtlk123 = k in 
    true 
Các vấn đề liên quan