2012-07-03 32 views
5

Tại sao loại dấu cộng (+) được coi là int -> int -> int trái ngược với (int * int) -> int? Đối với tôi, thứ hai có ý nghĩa bởi vì nó "chấp nhận" một 2-tuple (các phụ lục) và trả về một đơn int (tổng của chúng).Loại OCaml của toán tử cộng

Cảm ơn bạn!

Trả lời

11

Bạn có thể tạo ngôn ngữ trong đó (+) có loại (int * int) -> int. Trong thực tế, SML hoạt động chính xác theo cách này. Nó chỉ ảnh hưởng đến ý nghĩa của các toán tử infix. Tuy nhiên, các quy ước OCaml ủng hộ mạnh mẽ việc sử dụng các chức năng đã được kiểm soát (của loại a -> b -> c) chứ không phải là những cái chưa được kiểm soát. Một kết quả tốt đẹp là bạn có thể áp dụng một phần chúng. Ví dụ ((+) 7) là một biểu thức có ý nghĩa của loại int -> int. Tôi thấy ký hiệu này hữu ích khá thường xuyên.

+1

Bạn có thể giải thích bằng ((+) 7) thuộc loại int-> int không? Điều đó làm tôi bối rối. Làm thế nào để nó đi từ int đến int? –

+1

Câu trả lời ngắn gọn là đó là một chức năng cho biết thêm 7 bất cứ điều gì bạn cung cấp cho nó. Nó tương đương với 'fun x -> x + 7'. Đối với một câu trả lời dài hơn, tôi có thể chỉnh sửa câu trả lời của tôi ở trên nếu bạn muốn. –

+0

@JeffreyScofield: tốt, về mặt kỹ thuật, nó tương đương với 'vui vẻ x -> 7 + x', nhưng ở đây cũng giống như vậy – newacct

2

Điều này có vẻ hơi vô ích, nhưng đó là vì hàm này lấy hai đối số.

Khi một hàm lấy một bộ, nó có hiệu lực khi tham gia một đối số.

Bởi vì (+) là một hàm nội tuyến, lấy một đối số sẽ không hữu ích, vì nó sẽ trông giống như + (1,2) như trái ngược với 1 + 2.

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