首页 > 解决方案 > 在 F# 中获取匹配条件的元素的所有索引

问题描述

让我们列个清单:

let l = [ 1; 2; 3; 4; 5 ]

如何获取与谓词匹配的元素的索引列表?

我可以:

l |> List.FindIndex (fun x -> x >=2 && x <= 4)

但对于第一个匹配案例,它将返回一个索引。我正在寻找的是一个返回的函数: [ 1; 2;3 ],对于这个例子,或者 [] 如果没有匹配

我可以递归地输入列表尾部并实现这一点,但它令人费解且混乱。我可以遍历列表并将索引添加到集合中,但这也很麻烦。

收藏图书馆里有什么东西吗?我查看了一个'T list -> int list签名,但找不到任何东西。

标签: collectionsf#

解决方案


我不确定 List 模块上是否有内置函数,但使用其他函数很容易做到这一点。

let l = [ 1; 2; 3; 4; 5 ]

let idxs = 
    l
    |> List.indexed
    |> List.filter (fun (_, x) -> x >= 2 && x <= 4)
    |> List.map fst

如果你想要像 Haskell 一样的自己的findIndicies函数Data.List,你可以这样做:

module List =
    let findIndicies filter xs =
        xs
        |> List.indexed
        |> List.filter (snd >> filter)
        |> List.map fst

l |> List.findIndicies (fun x -> x >= 2 && x <= 4)

推荐阅读