在OCaml中,为什么Core的List.find中有辅助功能?

jpv*_*aza 5 ocaml list

在Core中,List.find使用辅助函数定义,如下所示:

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
Run Code Online (Sandbox Code Playgroud)

但它可以直接定义.例如:

let rec find l ~f =
  match l with
  | []       -> None
  | hd :: tl -> if f hd then Some hd else find tl f
Run Code Online (Sandbox Code Playgroud)

使用辅助功能来定义一个函数是否有任何优势List.find

Pas*_*uoq 5

在这种情况下,它没有太大变化,因为这两个函数都是尾递归的,但是,你的问题的答案仍然是:

调用find需要传递两个参数.调用find_aux需要传递一个参数.传递参数不是免费的:它们会占用堆栈空间,如果函数不是尾递归则限制最大递归深度,并且它们需要时间来设置.

这是一个权衡:在Core的版本中,必须分配一个闭包来将名称绑定f到其(本地)永久值.如果列表很短,分配闭包可能比传递一些额外的参数更昂贵(特别是因为函数是尾递归的).

基本上,你不应该担心它.在这种情况下可能是不必要的,即使没有必要,也没有太大的区别.