gpt4 book ai didi

.net - F# 库中是否有任何 "List.divideAt"HOF?

转载 作者:行者123 更新时间:2023-12-02 06:55:08 24 4
gpt4 key购买 nike

我实现了一个我选择调用 divideAt 的函数:

module List =
let divideAt predicate list =
let rec divideAt' acc = function
| [] -> (List.rev acc, [])
| h::_ as ls when predicate h -> (List.rev acc, ls)
| h::t -> divideAt' (h::acc) t
divideAt' [] list

这个想法相对简单:有时您想要给定列表中的一个元素,将其之前的所有元素分隔到一个左列表中,并将其之后的所有元素分隔到另一个列表中。

我查看了 List 的所有函数,但找不到任何可以让我以高效方式执行此操作的函数。或者有吗?完全依赖于高阶函数的等效但速度较慢的实现可以通过这种方式完成,例如:

let divideAt predicate list =
match List.tryFindIndex predicate list with
| None -> (list, [])
| Some(index) -> (List.take index list, List.skip index list)

有没有什么东西可以让我更简洁地实现这一点,而不必依赖“低级”递归算法,又不会像使用此 HOF 实现时那样造成性能损失?

谢谢

最佳答案

我能想到的唯一改变是使用已经处理的 List.splitAt,take/skip 部分(可能更好):

let divideAt predicate list =
match List.tryFindIndex predicate list with
None -> list, []
| Some index -> List.splitAt index list

或者,这里是同一事物的另一种语法;我不认为函数调用和匹配表达式之间应该有性能差异,但以防万一:

let divideAt predicate list =
List.tryFindIndex predicate list
|> Option.map (List.splitAt >> (|>) list)
|> defaultArg <| (list, [])

关于.net - F# 库中是否有任何 "List.divideAt"HOF?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33113602/

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