2011-11-15 15 views
23

Hãy để f x y = x * y. Chúng tôi có thể áp dụng chức năng này theo hai cách: f 5 6 hoặc sử dụng ký hiệu infix, 5 `f` 6. Các quy tắc của nhà điều hành có áp dụng cho biểu thức cuối cùng này không? Ứng dụng này có ưu tiên gì? Nó chỉ là một dạng ứng dụng chức năng khác, và nó cũng sẽ có ưu tiên cao nhất?Ưu tiên ứng dụng chức năng Haskell infix

Tôi cho rằng trình biên dịch thấy biểu mẫu đặc biệt này (do `` và/hoặc tên bắt đầu bằng chữ cái (?)) Và thực sự coi đây là ứng dụng chức năng thông thường, thay vì coi nó là toán tử.

+2

Cú pháp Haskell 98 cho phép bạn chọn mức độ ưu tiên, xem http://www.haskell.org/onlinereport/decls.html#fixity để biết chi tiết. –

+0

Cảm ơn Atal S-Z để chỉnh sửa! – demi

Trả lời

22

Các Haskell 98 Report có một phần trên Operator Applications mà xóa nó lên:

Một nhà điều hành hoặc là một biểu tượng nhà điều hành, chẳng hạn như + hoặc $$, hoặc là một nhận dạng bình thường kèm theo trong dấu huyền (backquotes) , chẳng hạn như `op`. Ví dụ, thay vì viết ứng dụng tiền tố op x y, người ta có thể viết ứng dụng infix x `op` y. Nếu không có tuyên bố cố định được đưa ra cho `op` thì giá trị mặc định là ưu tiên cao nhất và để lại tính kết hợp (xem Phần 4.4.2).

Như đã nêu bởi các câu trả lời khác, Báo cáo cũng có một phần trên Fixity Declarations cho phép bạn xác định tính ổn định của riêng bạn, ví dụ:

infixl 7 `op` 
9

Nếu không có tuyên bố xác định rõ ràng nào, ví dụ:

infixl 7 `quot` 

chức năng nhúng ngược có độ cố định là infixl 9, vì vậy sẽ được xử lý giống như bất kỳ nhà điều hành nào khác có cùng độ cố định.

+0

Tại sao nó mặc định để infixl 9? Có lý do nào đằng sau sự lựa chọn này, hay là tùy ý? – CMCDragonkai

+1

Nói cách khác, nó tùy ý. Nhưng vì nó có 'infix' không cho phép chuỗi không có dấu ngoặc đơn, nên thuận tiện hơn để có hướng kết hợp. Tính tương đối phải là hiếm hơn, do đó, 'infixl' là lựa chọn" đáng ngạc nhiên nhất ". Mức ưu tiên của 9 là gần nhất với tiền tố ứng dụng tiền tố, do đó thay đổi ít nhất so với ứng dụng tiền tố. Tôi đã không có ở đó khi nó đã được quyết định, nhưng tôi nghĩ rằng ý tưởng là 'infixl 9' đã được chọn với kỳ vọng rằng nó là thuận tiện nhất và gây ra ít ngạc nhiên nhất. –

+0

Tôi hiểu, nhưng về những thứ như '!!' và '$'. Có lý do nào cho lý do tại sao '!!' có ưu tiên cao hơn '$'? Chỉ cần cố gắng hiểu lý do cho tất cả vị trí của các toán tử trong bảng: https://www.haskell.org/onlinereport/decls.html#fixity – CMCDragonkai