Đây có phải là lỗi trong trình kiểm tra loại không?Lỗi loại khi gán một loại forall hợp lệ vào biến giới hạn
Prelude> let (x :: forall a. a -> a) = id in x 3
<interactive>:0:31:
Couldn't match expected type `forall a. a -> a'
with actual type `a0 -> a0'
In the expression: id
In a pattern binding: (x :: forall a. a -> a) = id
Thực tế là không ở trên để gõ kiểm tra, nhưng sự nhăn mặt này thành công:
Prelude> let (x :: (forall a. a -> a) -> Int) = (\f -> f 3) in x id
3
dẫn tôi nghĩ rằng "chuyển đổi prenex yếu" (xem trang 23 của this paper) có thể liên quan bằng cách nào đó . Nhúng một forall
vào một vị trí contravariant nơi nó không thể "trôi nổi" dường như giữ nó an toàn khỏi lỗi kỳ lạ này.
Thú vị. Tôi nhận được một thông báo lỗi khác trên GHC 6.12.1: "Loại suy ra ít đa hình hơn dự kiến. Biến kiểu số lượng 'a' thoát trong biểu thức: id". – hammar
Tôi đang sử dụng GHC 7.2.1, FWIW. –
Tôi có thể sai (Tôi đang ở trên một GHC cũ), nhưng đó không phải là hợp pháp Haskell 98/2010. Bạn có tiện ích mở rộng nào? Điều đó có thể giải thích những gì đang xảy ra. (Tôi nhận được lỗi tương tự như hammar, do đó, vấn đề có thể là 'a' không có nghĩa là bạn mong đợi.) –