2015-01-31 14 views
18

Đoạn sau biên dịch:Ưu tiên của ~ là gì và tại sao?

{-# LANGUAGE TypeFamilies #-} 
type family Foo a b 

f :: (Foo a b ~ Int) => a -> b -> b 
f = error "" 

nhưng ghi vào loại nhà khai thác dường như hành xử khác nhau:

{-# LANGUAGE TypeFamilies #-} 
type family a \\ b 

f :: (a \\ b ~ Int) => a -> b -> b 
f = error "" 

GHC phàn nàn rằng đối số thứ hai để \\ nên có loại *, nhưng b ~ Int có loại Constraint . Tất nhiên điều này có thể được cố định với parens, nhưng tôi tự hỏi nếu có một cách khác.

tôi đã cố gắng thiết lập các ưu tiên của các nhà điều hành của tôi với việc kê khai tính cố định infixl 9 \\, nhưng điều đó không giải quyết vấn đề, chỉ ra rằng ưu tiên của ~at least 9 (nếu tôi giải thích rằng chính xác). Tôi đã thử sử dụng mẹo từ this answer để làm cho GHCi cho tôi biết mức độ ưu tiên của ~, nhưng nó không hoạt động.

Về mặt kỹ thuật, ~ lẽ không phải là một nhà điều hành loại, đó là chi tiết của một cấu trúc từ vựng tương tự như ,, nhưng câu hỏi vẫn đứng:

  1. Tại sao ghi vào và tiền tố nhà khai thác hiện hành vi khác nhau?
  2. Tại sao ~ liên kết chặt chẽ?
  3. Có điều gì tôi có thể làm để làm cho các toán tử của riêng tôi gắn kết chặt chẽ hơn nữa không?

(Lưu ý: This question hỏi về các ưu tiên của các chức năng loại, nhưng nó không nói bất cứ điều gì về ~.)

+0

Một điều kỳ lạ là nếu tôi hỏi GHCi ': k (~)', nó nói với tôi '(~) :: k -> k -> Constraint', nhưng nếu tôi hỏi ': i (~)', nó cho tôi biết "lỗi phân tích cú pháp trên đầu vào '~''. Vì vậy, một cái gì đó có vẻ rất lạ về cách trình phân tích cú pháp xử lý '~'. – dfeuer

+0

Tôi không chắc chắn nguyên nhân của việc này là gì - '~' có một số hành vi đặc biệt do là một chức năng kiểu tích hợp, và có lẽ nó phải phù hợp với những thứ khác. Nhưng nếu điều này thực sự làm phiền bạn, bạn có thể làm một cái gì đó như 'type (==) = (~); infixr 0 == ', thậm chí sẽ có nhiều cú pháp nhất quán giữa cấp độ và loại. – user2407038

+0

Tôi có [vé GHC] (https://ghc.haskell.org/trac/ghc/ticket/10056) ngay bây giờ – crockeea

Trả lời

1

~ không phải là một nhà điều hành, đó là một từ khóa, như module hoặc case, vì vậy Tôi nghĩ bạn chỉ có thể thay đổi ưu tiên bằng cách sử dụng dấu ngoặc đơn.

Xem thêm ở đây: https://wiki.haskell.org/Keywords#.7E

+0

Đó rõ ràng không phải là toàn bộ câu chuyện. Có, '~' trong một mẫu là cú pháp, nhưng trong các ngữ cảnh khác, nó là toán tử kiểu. – dfeuer

+1

Nó có vẻ giống như một nhà điều hành kiểu bởi vì bạn có thể nhận được loại của nó, nhưng không phải là nó có thể nó chỉ * hành vi * như một? – lightandlight

+0

Tôi không đủ kỹ năng để chải nguồn cho việc triển khai, nhưng đó là điều tôi nghi ngờ. – lightandlight

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