2012-05-08 35 views
5

Tôi biết rằng OCaml không hỗ trợ quá tải. Sau đó, thay vì quá tải, chúng ta có thể làm gì để làm việc này?Quá tải trong Ocaml

1) sử dụng đa hình thay thế? 2) cung cấp các chức năng khác nhau cho các tên khác nhau? 3) đặt chức năng cùng tên trong các mô-đun khác nhau?

Cái nào sẽ hoạt động?

Trả lời

13

Tất cả phụ thuộc vào ý bạn là do quá tải. Có một số trường hợp sử dụng, chẳng hạn như:

Nếu bạn muốn sử dụng tên toán tử infix thông thường trong biểu thức toán học, hãy thao tác một số thứ khác với số nguyên: rebind các toán tử của bạn cục bộ; các mô-đun và "mở cục bộ" có thể giúp với điều đó.

module I32 = struct 
    open Int32 
    let (+), (-), (*), (/), (!!) = add, sub, mul, div, of_int 
end 

... I32.(x + y * !!2) ... 

Nếu bạn muốn hoạt động đa hình trong loại kiểu số được sử dụng, bạn cần trừu tượng trên các toán tử số như vậy. Ví dụ generic function lũy thừa nhanh (bằng một số nguyên), có thể được sử dụng trên ma trận, vv

let rec pow (*) one a = function 
    | 0 -> one 
    | n -> pow (*) (if n mod 2 = 0 then one else one * a) (a * a) (n/2) 

let() = assert (pow (*.) 1. 2. 3 = 8.) 

Tổng quát hơn, vâng, ý tưởng là để nắm bắt những gì bạn muốn "quá tải" trên là một tập hợp các toán tử (ở đây là các toán tử infix nhưng các tên thuần túy là tốt và thường dễ đọc hơn), và truyền xung quanh và trừu tượng hóa các từ điển của các hoạt động đó - giống như những gì các lớp kiểu Haskell được biên dịch, trên thực tế.

+0

Tôi nhận thấy bạn đã thực hiện 'mở Int32' trong mô-đun I32, điều gì sẽ khác nếu bạn đã thực hiện 'bao gồm Int32' ở đó? Về cơ bản chúng có tương đương trong ngữ cảnh đó không? – aneccodeal

+1

@aneccodeal: điều đó sẽ rất khác: nếu tôi sử dụng 'include', 'I32' này sẽ bao gồm tất cả' Int32', do đó mở 'I32' cục bộ sẽ nhập tất cả các định nghĩa của' Int32'. Tôi không muốn 'mở' phạm vi lớn bởi vì nó có nguy cơ che khuất định nghĩa người dùng. – gasche