2010-11-22 65 views
10

Sự khác nhau giữa 'a'_l là gì?Sự khác nhau giữa 'a và' _l là gì?

Tôi đã nhìn vào lỗi này, và không thể hiểu được nó:

Error: This expression has type ('a -> float polynomial) list but an expression was expected of type float polynomial list derivlist: ('_l → float polynomial) list 

Trả lời

23

_ 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 listbool 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).

1

Có một biến kiểu yếu trong thông báo lỗi từ trình biên dịch, nhưng tôi không chắc rằng biến yếu có liên quan đến lỗi (tôi không thấy trạng thái của biến kiểu có thể là nguyên nhân của điều này như thế nào thông điệp).

Bạn có chắc chắn rằng bạn không xác định hai loại polynomial? Đó là câu hỏi ngay phía trên hai chỉ ra bởi gashe trong câu trả lời của anh ấy trong FAQ ("Error message: a type is not compatible with itself").

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