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

标签 .net f# functional-programming

我实现了一个我选择调用 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/

相关文章:

java - Scala编译时错误: No implicits found for parameter evidence$2: BodyWritable[Map[String,对象]]

f# - 如何做Seq.takeWhile + F#中的一项

.net - Aforge 的灰度滤镜的参数是什么?

visual-studio - F# 交互式窗口有什么用?

c# - 您认为 F# 的异步工作流将来会在 C# 中引入吗?

f# - 记录等于或 GetHashCode 抛出 NullReferenceException

python-3.x - 函数式编程: How does one create a new column to a dataframe that contains a multiindex column?

c# - 为什么 Invoke via Delegate 不内置到 .NET 中

c# - .net c sharp executeScalar() 或 executeNonQuery()

c# - 关于 DI 和 IoC 容器的一个问题