F#库中有"List.divideAt"HOF吗?

dev*_*ium 2 .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
Run Code Online (Sandbox Code Playgroud)

这个想法相对简单:有时你想给定一个列表中的元素,将它之前的所有元素分成左边的列表,然后将所有元素分成另一个元素.

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

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

是否有一些东西可以让我更简洁地实现这一点而不必依赖"低级"递归算法而不会像使用这个HOF实现时那样产生性能损失?

谢谢

Seh*_*cht 6

我能想到的唯一变化是使用List.splitAt哪个已经处理,采取/跳过部分(可能更好):

let divideAt predicate list =
  match List.tryFindIndex predicate list with
    None       -> list, []
  | Some index -> List.splitAt index list
Run Code Online (Sandbox Code Playgroud)

或者,这是另一种相同的语法; 我不认为函数调用和匹配表达式之间应该存在性能差异,但是在以下情况中:

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

  • 嗯,似乎MSDN文档相当落后:https://msdn.microsoft.com/en-us/library/ee353738.aspx VisualStudio 2015与F#虽然有这个功能.谢谢! (2认同)