_
biểu thị một biến yếu đa hình: nó đang ở trong một vị trí mà nó không thể được khái quát hóa.
Có hai giải thích liên quan đến đa hình yếu trong Câu hỏi thường gặp về OCaml: xem A function obtained through partial application is not polymorphic enough và phần tiếp theo. Điều này thường xảy ra khi bạn đang sử dụng tham chiếu không cục bộ (không thể khái quát) hoặc khi xác định các hàm đa hình không có chức năng cú pháp (chúng không bắt đầu bằng fun x -> ..
mà là ứng dụng chức năng). Trong một số trường hợp có một sửa chữa dễ dàng (eta-mở rộng, xem các câu hỏi thường gặp), đôi khi không có, và đôi khi chương trình của bạn chỉ là không rõ ràng.
Ví dụ dễ dàng: let a = ref []
không nhận được loại đa hình a list ref
. Nếu không, bạn có thể sử dụng cả hai dạng là int list
và bool list
và trộn các thành phần của các loại khác nhau bằng cách tắt tham chiếu. Thay vào đó, nó nhận được loại '_a list ref
. Điều này có nghĩa là loại không đa hình, nhưng chỉ đơn thuần là không rõ. Khi bạn làm điều gì đó với a
với một loại cụ thể, nó sẽ sửa lỗi '_a
một lần và mãi mãi.
# let a = ref [];;
val a : '_a list ref = {contents = []}
# let sum_of_a = List.fold_left (+) 0 !a;;
val sum_of_a : int = 0
# a;;
- : int list ref = {contents = []}
Đối với một lời giải thích sâu hạn chế giá trị và hạn chế giá trị "thoải mái" thực sự thực hiện trong các loại hình kiểm tra OCaml, xem Relaxing the Value Restriction giấy bởi Jacques Garrigue (2004).