2014-07-24 16 views
5

Trong Core, List.find được định nghĩa sử dụng một chức năng phụ trợ như sau:Trong OCaml, tại sao có chức năng phụ trợ trong List.find của Core?

let find l ~f = 
    let rec find_aux = function 
    | []  -> None 
    | hd :: tl -> if f hd then Some hd else find_aux tl 
    in 
    find_aux l 

Nhưng nó có thể được định nghĩa trực tiếp. Ví dụ:

let rec find l ~f = 
    match l with 
    | []  -> None 
    | hd :: tl -> if f hd then Some hd else find tl f 

Có lợi thế nào khi sử dụng chức năng phụ trợ để xác định chức năng như List.find?

+0

Trong Haskell các cơ hội nội tuyến bổ sung mà bạn nhận được bằng cách thực hiện loại điều này là một việc lớn. Tôi không biết liệu OCaml có giống nhau hay không. Cụm từ tìm kiếm: chuyển đổi đối số tĩnh, chuyển đổi công nhân-wrapper –

Trả lời

5

Trong trường hợp này, nó không thay đổi nhiều vì cả hai chức năng là đuôi-đệ quy, nhưng vẫn còn, câu trả lời cho câu hỏi của bạn là:

gọi find đòi hỏi đi qua hai đối số. Gọi số find_aux yêu cầu chuyển một đối số. Đối số truyền không miễn phí: chúng chiếm không gian trên ngăn xếp, hạn chế độ sâu đệ quy tối đa nếu hàm không đệ quy đuôi và mất thời gian để thiết lập.

Đây là sự cân bằng: trong phiên bản của Core, phải đóng cửa một đóng để ràng buộc tên f với giá trị vĩnh viễn (cục bộ) của nó. Nếu danh sách ngắn, phân bổ việc đóng cửa có thể tốn kém hơn so với truyền một vài đối số bổ sung (đặc biệt là vì hàm này đệ quy đuôi).

Về cơ bản, bạn không nên lo lắng về điều đó. Nó có lẽ là không cần thiết trong trường hợp này, và ngay cả khi nó không phải là không cần thiết, nó không tạo ra sự khác biệt lớn.

+0

câu trả lời rất ngắn gọn nhưng kỹ lưỡng. tốt để biết –

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