collections - 在 F# 中获取匹配条件的元素的所有索引
问题描述
让我们列个清单:
let l = [ 1; 2; 3; 4; 5 ]
如何获取与谓词匹配的元素的索引列表?
我可以:
l |> List.FindIndex (fun x -> x >=2 && x <= 4)
但对于第一个匹配案例,它将返回一个索引。我正在寻找的是一个返回的函数: [ 1; 2;3 ],对于这个例子,或者 [] 如果没有匹配
我可以递归地输入列表尾部并实现这一点,但它令人费解且混乱。我可以遍历列表并将索引添加到集合中,但这也很麻烦。
收藏图书馆里有什么东西吗?我查看了一个'T list -> int list
签名,但找不到任何东西。
解决方案
我不确定 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)
推荐阅读
- java - 不清楚如何设置 JavaFX (VSCode)
- swiftui - 将 SwiftUI 视图调整为 safeAreaInsets.top + 'x'
- mysql - 在 MySQL 中清理 JSON 提取
- python - python堆叠标题中缺少值的数据
- c - C 程序 - 跳过用户输入
- java - 抑制 JSLT 中的科学/指数符号
- python - 如何将内部字典键/值提取到 Python 中的新字典中?
- java-platform-module-system - 扩展 java.base 模块(向 java.net 包添加类)
- firebase - Flutter Cloud Firestore - 当文档等于当前用户ID时如何显示当前用户显示名称?
- fiware - Draco NgsiToMongo 处理器问题