2011-07-28 30 views
6

tôi đã xác định một số loại:Chức năng quá tải trong OCaml

type box = Box of int 
type table = Table of int 
type compare_result = Lt | Eq | Gt 

Dường như trong OCaml, chúng ta không thể xác định 2 chức năng cùng tên nhưng khác kiểu của đối số:

let compare (a: box) (b: box): compare_result = (...) 
let compare (a: table) (b: table): compare_result = (...) 

let res_box = compare (Box 1) (Box 2) in (* which is supposed to call the first funciton *) 
let res_table = compare (Table 1) (Table 2) in (* which is supposed to call the second function *) 

Vì vậy, bất cứ ai có thể cho tôi biết những gì là thay thế trong OCaml để làm điều này? Chúng ta có phải đặt tên cho 2 chức năng này một cách khác nhau không?

+1

Xin lưu ý rằng lần khai báo thứ hai của 'so sánh' sẽ ẩn lần trước đó (không có quá tải hàm trong Ocaml). – akoprowski

Trả lời

6

Có, giải pháp đơn giản nhất đơn giản là gọi các chức năng khác nhau. Cho phép các chương trình thực hiện điều này làm phức tạp hệ thống kiểu (không đến mức các chuyên gia không thể thiết kế một giải pháp: đến mức bạn sẽ thấy nó không thể sử dụng được khi chúng thực hiện).

Giải pháp hiện tại để viết một hàm duy nhất compare là hệ thống đối tượng trong OCaml và nhập các lớp trong Haskell (một phần mở rộng khác cho cùng hệ thống kiểu cơ sở). Nhưng nó đơn giản hơn nhiều để ở trong mảnh đơn giản và đặt tên cho các hàm của bạn compare khác nhau.

+8

Một cách khác để tạo compare_box và compare_table là bao bọc từng loại và so sánh hàm trong mô-đun riêng của chúng. Sau đó bạn sẽ gọi Box.compare và Table.compare. – hcarty

+0

Tạo các mô-đun riêng cũng thuận tiện nếu bạn có kế hoạch tạo một 'Tập' hoặc' Bản đồ' từ loại. – nlucaroni

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