在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
?
在这种情况下,它没有太大变化,因为这两个函数都是尾递归的,但是,你的问题的答案仍然是:
调用find
需要传递两个参数.调用find_aux
需要传递一个参数.传递参数不是免费的:它们会占用堆栈空间,如果函数不是尾递归则限制最大递归深度,并且它们需要时间来设置.
这是一个权衡:在Core的版本中,必须分配一个闭包来将名称绑定f
到其(本地)永久值.如果列表很短,分配闭包可能比传递一些额外的参数更昂贵(特别是因为函数是尾递归的).
基本上,你不应该担心它.在这种情况下可能是不必要的,即使没有必要,也没有太大的区别.