gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 19:05:53 27 4
gpt4 key购买 nike

在核心中,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 之类的函数有什么好处吗? ?

最佳答案

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

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

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

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

关于list - 在OCaml中,为什么Core的List.find中有辅助功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24944422/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com