gpt4 book ai didi

.net - F# Seq.tryPick 并将函数应用于未选取的成员

转载 作者:行者123 更新时间:2023-12-01 06:18:34 25 4
gpt4 key购买 nike

这有可能吗?我想使用 tryPick,然后继续处理集合的“其余部分”。

我只能想到丑陋的方法来做到这一点:

let sequence = Seq.init 5 (fun (i) -> i)
let pickedMember =
sequence
|> Seq.tryPick (fun (i) ->
if i = 2 then
Some i
else
None
);;
let sequenceWithoutPickedMember = sequence |> Seq.filter (fun (i) -> not(i=pickedMember.Value));;

最佳答案

您可以使用 fold 同时执行这两项操作,返回一个包含唯一选项和其余选项的元组。

只要唯一的是None,你就检查你的谓词(这里等于2)
当它为真时(如果有的话),您将单独的更新为该项目并从序列中跳过该项目
否则,您只需该项目添加到生成的“rest sequence”

我把它变成了一个带有谓词参数的更通用的函数:

let firstAndRest predicate source =
source
|> Seq.fold (fun (lone, rest) item -> if Option.isNone lone && predicate item
then Some item, rest
else lone, seq { yield! rest; yield item })
(None, Seq.empty)

// usage with example given
let sequence = Seq.init 5 id

let pickedMember, sequenceWithoutPickedMember = firstAndRest ((=) 2) sequence

// pickedMember : Some 2
// sequenceWithoutPickedMember : seq [0; 1; 3; 4]

编辑

由于嵌套序列表达式与我有关(它可以使长序列的大量枚举器保持事件状态),这里有一个使用索引的替代方法。

想法是找到该项目(如果有的话)的索引而不是项目本身。
完成后,我们得到该索引处的项目并将序列拆分为两部分。
after 部分将包含找到的项,因此我们需要丢弃它(通过再跳过一项)
如果找不到该项目,我们只会返回原始来源。

let firstAndRest predicate source =
let source = Seq.cache source // to prevent yielding different values for side-effect sequences

match Seq.tryFindIndex predicate source with
Some index -> let picked = source |> Seq.item index |> Some

let before, after = Seq.take index source, Seq.skip (index + 1) source
picked, Seq.append before after
| None -> None, source

关于.net - F# Seq.tryPick 并将函数应用于未选取的成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40654121/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com