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ì?
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
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