gpt4 book ai didi

f# - 从 F# 中的列表中提取单个元素

转载 作者:行者123 更新时间:2023-12-04 14:21:23 25 4
gpt4 key购买 nike

我想从 F# 中的序列中提取单个项目,或者如果没有或多个则给出错误。做这个的最好方式是什么?

我目前有

let element = data |> (Seq.filter (function | RawXml.Property (x) -> false | _ -> true))
|> List.of_seq
|> (function head :: [] -> head | head :: tail -> failwith("Too many elements.") | [] -> failwith("Empty sequence"))
|> (fun x -> match x with MyElement (data) -> x | _ -> failwith("Bad element."))

它似乎有效,但这真的是最好的方法吗?

编辑:当我被指出正确的方向时,我想出了以下内容:
let element = data |> (Seq.filter (function | RawXml.Property (x) -> false | _ -> true))
|> (fun s -> if Seq.length s <> 1 then failwith("The sequence must have exactly one item") else s)
|> Seq.hd
|> (fun x -> match x with MyElement (_) -> x | _ -> failwith("Bad element."))

我想它会好一点。

最佳答案

以现有序列标准函数的风格完成

#light

let findOneAndOnlyOne f (ie : seq<'a>) =
use e = ie.GetEnumerator()
let mutable res = None
while (e.MoveNext()) do
if f e.Current then
match res with
| None -> res <- Some e.Current
| _ -> invalid_arg "there is more than one match"
done;
match res with
| None -> invalid_arg "no match"
| _ -> res.Value

你可以做一个纯粹的实现,但它最终会跳过篮球以保持正确和高效(在第二场比赛中快速终止真的需要一个标志说“我已经找到了”)

关于f# - 从 F# 中的列表中提取单个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/825858/

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