gpt4 book ai didi

linq - F# 相当于 LINQ Single

转载 作者:行者123 更新时间:2023-12-03 22:54:32 24 4
gpt4 key购买 nike

好的,所以对于大多数 LINQ 操作来说,都有一个 F# 等价物。
(一般在 Seq 模块中,因为 Seq= IEnumerable)

我找不到 IEmumerable.Single 的等价物, 我更喜欢 Single超过 First (这是 Seq.find),因为它更具防御性 - 它对我来说断言状态是我所期望的。

所以我看到了几个解决方案(除了使用 Seq.find 之外)。
(这些可以写成扩展方法)

我只调用这个函数的类型签名是

('a->bool) -> seq<'a> -> 'a

let only = fun predicate src -> System.Linq.Enumerable.Single<'a>(src, predicate)

let only2 = Seq.filter >> Seq.exactlyOne
only2是首选,但它不会编译(有任何线索吗?)。

最佳答案

在 F# 2.0 中,这是一个无需枚举整个序列的解决方案(接近您的第二种方法):

module Seq =
let exactlyOne seq =
match seq |> Seq.truncate 2 with
| s when Seq.length s = 1 -> s |> Seq.head |> Some
| _ -> None

let single predicate =
Seq.filter predicate >> exactlyOne

我选择退货 option类型,因为在 F# 高阶函数中引发异常是非常不寻常的。

编辑:

在 F# 3.0 中,正如@Oxinabox 在他的评论中提到的那样, Seq.exactlyOne存在于 Seq 模块中。

关于linq - F# 相当于 LINQ Single,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9850769/

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