2012-05-19 26 views
6

"Introduction to Caml" nóiTại sao lại thích currying đối với các tham số tuple trong OCaml?

Lưu ý, trong CAML nó là tốt hơn để sử dụng cà ri định nghĩa chức năng cho các chức năng nhiều đối số, không tuples.

khi so sánh 'a -> 'b -> 'c quy ước gọi đến 'a * 'b -> 'c.

Khi làm việc với SML/NJ, tôi đã quen với việc sử dụng các loại bộ tuple cho cả đầu vào và đầu ra: ('a * 'b) -> ('c * 'd) để sử dụng bộ dữ liệu để thể hiện nhiều đầu vào.

Tại sao currying được đề xuất cho khai báo hàm OCaml trên đối số tuple? Nó chỉ là sự linh hoạt lớn hơn mà đi kèm với cho phép currying/một phần đánh giá, hoặc là có một số lợi ích khác có nguồn gốc từ các chi tiết thực hiện của trình biên dịch OCaml?

+2

Sự lựa chọn của hầu hết các chức năng trong Caml-ánh sáng và các phiên bản tiếp theo được giải thích trong báo cáo "Thí nghiệm ZINC: thực hiện kinh tế ngôn ngữ ML". Một điều tôi nhớ là với chương trình đánh giá thích hợp (được mô tả trong báo cáo), một chức năng được thu thập không yêu cầu phân bổ để được gọi. http://caml.inria.fr/pub/papers/xleroy-zinc.ps.gz –

+0

@PascalCuoq, trong khi tuple cần được phân bổ, giải nén và sau đó là GC? –

+0

Có, nếu hàm này cũng có ý định được gọi với các bộ dữ liệu có sẵn ('ft'), thì không có cách nào xung quanh thực tế rằng một tuple tạm thời ngắn' (x, y) 'phải được cấp phát để áp dụng' f' đến khi cái nào chỉ có 'x' và' y'. –

Trả lời

2

Có, nó chủ yếu là sự tiện lợi về mặt lý thuyết và tính linh hoạt để thực hiện một phần ứng dụng. Các hàm curried là thành ngữ trong OCaml, và trình biên dịch có khả năng tối ưu hóa chúng tốt hơn một chút so với các hàm tupled (trong khi các trình biên dịch SML thường tối ưu hóa cho các bộ dữ liệu).

Ưu điểm của tupling là đối số/kết quả đối xứng bạn đề cập (đặc biệt hữu ích khi soạn hàm) và có lẽ là sự quen thuộc không hợp lý (ít nhất là đối với những người đến từ thế giới phi chức năng).

1

Một số nhận xét về tối ưu hóa trong OCaml.

Trong OCaml, tôi nhận thấy rằng bộ dữ liệu luôn được phân bổ khi chuyển chúng làm đối số. Ngay cả khi phân bổ trong heap chính là nhanh chóng trong ocaml, nó là tất nhiên dài hơn không làm gì cả. Vì vậy, mỗi khi bạn vượt qua một tuple như đối số, có một số thời gian dành cho việc phân bổ và điền vào các tuple.

Tôi hy vọng rằng trình biên dịch ocaml sẽ tối ưu hóa các trường hợp không cần thiết để xây dựng bộ tuple. Ví dụ, khi bạn nội tuyến hàm được gọi, bạn chỉ có thể sử dụng các thành phần bộ tuple chứ không phải chính tuple. Do đó, tuple có thể bị bỏ qua. Thật không may trong trường hợp này OCaml không loại bỏ tuple vô ích và vẫn thực hiện việc phân bổ. Vì lý do này, có thể không nên sử dụng bộ dữ liệu trong các phần quan trọng của mã.

+0

Tôi nghĩ điều này không còn đúng nữa. ["OCaml thông minh hơn tôi nghĩ"] (https://blogs.janestreet.com/ocaml-is-smarter-than-i-thought/) nói "Tôi đã ngăn chặn nội tuyến, nhưng vẫn không có phân bổ! Vâng, nó chỉ ra rằng OCaml có thể tối ưu hóa một chức năng tuple-lấy để có được các yếu tố của tuple thông qua trong đăng ký, đó là chính xác những gì đã xảy ra. Và một lần nữa, trình biên dịch nhận ra rằng không có phân bổ đã được yêu cầu. –

5

Tôi nghĩ rằng rất nhiều trong số đó là các hàm thư viện chuẩn trong OCaml được curried, trong khi ở Standard ML chúng thường không ngoại trừ một số hàm bậc cao hơn. Tuy nhiên, có một sự khác biệt được đưa vào ngôn ngữ: các toán tử (ví dụ: (*)) được kết hôn trong OCaml (ví dụ: int -> int -> int); trong khi chúng không được sử dụng trong tiêu chuẩn ML (ví dụ: op* có thể là (int * int) -> int). Do đó, các hàm bậc cao được cài đặt sẵn (ví dụ: gấp) cũng có chức năng được xử lý trong OCaml và chưa được kiểm tra trong tiêu chuẩn ML; điều đó có nghĩa là chức năng của bạn để làm việc với điều đó, bạn cần phải tuân theo quy ước tương ứng, và nó theo sau từ đó.

+1

Điểm tốt. Có một trường hợp khác mà sự lựa chọn được đưa vào: các nhà xây dựng datatype. Trong SML chúng được tupled, trong Haskell chúng được curried. Kỳ lạ là đủ, trong OCaml họ được tupled, đó là một chút không phù hợp với phần còn lại của ngôn ngữ. –

+1

Ý nghĩa sâu sắc hơn đằng sau các nhà xây dựng datatype được tupled là một tuple là một nhà xây dựng dữ liệu trường hợp đặc biệt ẩn danh. –

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