F#仅从列表中筛选出第一个匹配项

Krz*_*nek 5 f# filter fold

我有一个列表,我想删除符合某些条件的元素,但只删除一个元素.

let items = [1;2;3]

let predicate x =
    x >= 2

let result = items |> List.fold ...
// result = [1;3]
Run Code Online (Sandbox Code Playgroud)

如何用[1; 3]实现返回列表的方法?

gil*_*CAD 6

您可以使用通用递归函数

let rec removeFirst predicate = function
    | [] -> []
    | h :: t when predicate h -> t
    | h :: t -> h :: removeFirst predicate t
Run Code Online (Sandbox Code Playgroud)

或尾递归(如果你担心堆栈溢出)

let removeFirst predicate list =
    let rec loop acc = function
        | [] -> List.rev acc
        | h :: t when predicate h -> (List.rev acc) @ t
        | h :: t -> loop (h :: acc) t
    loop [] list
Run Code Online (Sandbox Code Playgroud)