xem xét mã Haskell sau:Haskell phụ thuộc chức năng a b -> c tùy thuộc vào c?
{-# LANGUAGE MultiParamTypeClasses, FlexibleInstances,
FunctionalDependencies #-}
class C a b c | a b -> c
instance C (l (i,j)) (r i j) j
instance C (l i j) (r (i,j)) j
-- Conflict between the following two lines
instance C (l (i,j)) (r (i,j)) j
instance C (l i j) (r i j) j
Ở đây, GHC mang lại một lỗi phụ thuộc hàm giữa hai dòng cuối cùng. Nếu tôi thả bất kỳ một trong hai khai báo cá thể cuối cùng, thì mã sẽ biên dịch. Tôi đã thử một loại gia đình tương tự bằng cách sử dụng, mà cũng tạo ra một cuộc xung đột. Câu hỏi đầu tiên của tôi là: Tại sao hai dòng cuối cùng xung đột, trong khi các tờ khai khác tất cả đều làm việc tốt với nhau?
Bên cạnh đó, nếu tôi thay đổi dòng cuối cùng để
instance C (l i j) (r i j) i
GHC chấp nhận mã. Điều này có vẻ hơi lạ, vì điều duy nhất thay đổi là biến loại phụ thuộc c. Ai đó có thể giải thích hành vi này?
Chỉ để đảm bảo. Nếu bạn xóa cả hai phiên bản đầu tiên thì vẫn có lỗi, phải không? – genisage
@genisage Vâng, nó chỉ phụ thuộc vào hai trường hợp cuối cùng –
Tôi không thể tái tạo phần thứ hai ở đây. 'instance C (l i j) (r i j) i' gây ra xung đột cho tôi. (trên ghc 7.8.3) – genisage