2014-10-20 32 views

Trả lời

8

Với một chút kiểu hackery, chắc chắn:

let sum f = f 0 
let arg x acc g = g (acc + x) 
let z a = a 

Và (ab) cách sử dụng:

# sum z;; 
- : int = 0 
# sum (arg 1) z;; 
- : int = 1 
# sum (arg 1) (arg 2) (arg 3) z;; 
- : int = 6 

Gọn gàng, huh? Nhưng đừng dùng cái này - đó là một hack.

Đối với một lời giải thích, xem this page (về SML, nhưng ý tưởng là như nhau).

+0

Tôi sẽ không sử dụng điều này vì việc chuyển danh sách int là cách tốt hơn. Nhưng rất tốt đẹp sử dụng các chức năng cấp cao hơn và tiếp tục đi qua phong cách. –

9

OCaml được gõ mạnh, và nhiều kỹ thuật được sử dụng trong các ngôn ngữ khác (không định kiểu) là không phù hợp. Theo tôi (sau 50 năm lập trình) đây là một điều rất tốt, không phải là một vấn đề.

Cách rõ ràng nhất để xử lý một số biến của tham số cùng loại là phải vượt qua một danh sách:

# let sum l = List.fold_left (+) 0 l;; 
val sum : int list -> int = <fun> 
# sum [1;2;3;4;5;6];; 
- : int = 21 
Các vấn đề liên quan