Vấn đề với mã của bạn là khi bạn viết:
match x with
| y when x < y -> (...)
.. nó có nghĩa là bạn muốn gán giá trị của x
(các <expr>
trong match <expr> with
) cho một biến mới có tên y
(các <pat>
trong | <pat> when ...
) và sau đó so sánh mới này y
(hiện có chứa giá trị x
) với giá trị x
- và do đó, điều này sẽ luôn trả lại false
. Bạn luôn có thể đổi tên các biến ràng buộc, do đó, mã của bạn cũng giống như viết:
match x with
| newY when x < newY -> (...)
Bây giờ bạn có thể thấy tại sao điều này không bao giờ phù hợp - bởi vì bạn chỉ là so sánh x
với bản thân!
Kết hợp mẫu đặc biệt hữu ích nếu bạn có đầu vào của một số cấu trúc phức tạp hơn - như tuples hoặc phân biệt đối xử, danh sách, mảng, loại tùy chọn v.v. Nhưng nếu bạn chỉ muốn so sánh các số, sẽ dễ dàng hơn nhiều khi chỉ sử dụng if
:
let test x y =
if x < y then printfn "less than"
elif x > y then printfn "greater than"
else printfn "equal"
Trong match
của bạn, bạn không thực sự cần phải ràng buộc bất kỳ biến - nhưng giải pháp của John cho thấy làm thế nào bạn có thể làm cho rằng công việc - nó chỉ đơn giản nói, hãy biến x
và y
và gán chúng cho các biến mới x
và y
(chỉ có cùng tên).
Nguồn
2013-09-06 03:58:17
Cách tiếp cận thú vị Gene. –