【问题标题】:In OCaml, why is there an auxiliary function in Core's List.find?在OCaml中,为什么Core的List.find中有辅助功能?
【发布时间】:2014-07-24 21:36:35
【问题描述】:

在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

但是可以直接定义。例如:

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

使用辅助函数来定义诸如List.find之类的函数有什么好处吗?

【问题讨论】:

  • 在 Haskell 中,通过执行此类操作获得的额外内联机会非常重要。我不知道OCaml是否相同。搜索词:静态参数转换、worker-wrapper 转换

标签: list ocaml


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-03
    相关资源
    最近更新 更多