Tôi đang khám phá việc sử dụng "nâng cao" các hàm OCaml và tôi tự hỏi làm thế nào tôi có thể viết một hàm với số lượng đối số thay đổi.Chức năng OCaml với số biến số đối số
Ví dụ, một chức năng như:
let sum x1,x2,x3,.....,xn = x1+x2,+x3....+xn
Tôi đang khám phá việc sử dụng "nâng cao" các hàm OCaml và tôi tự hỏi làm thế nào tôi có thể viết một hàm với số lượng đối số thay đổi.Chức năng OCaml với số biến số đối số
Ví dụ, một chức năng như:
let sum x1,x2,x3,.....,xn = x1+x2,+x3....+xn
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).
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
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. –