gpt4 book ai didi

f# - 与空序列匹配

转载 作者:行者123 更新时间:2023-12-04 16:23:01 26 4
gpt4 key购买 nike

我正在学习 F# 并且我已经开始使用这两个序列和 match表达式。

我正在编写一个网页抓取工具,它通过类似于以下内容的 HTML 查看并获取父级中的最后一个 URL <span>paging类(class)。

<html>
<body>
<span class="paging">
<a href="http://google.com">Link to Google</a>
<a href="http://TheLinkIWant.com">The Link I want</a>
</span>
</body>
</html>

我尝试获取最后一个 URL 如下:
type AnHtmlPage = FSharp.Data.HtmlProvider<"http://somesite.com">

let findMaxPageNumber (page:AnHtmlPage)=
page.Html.Descendants()
|> Seq.filter(fun n -> n.HasClass("paging"))
|> Seq.collect(fun n -> n.Descendants() |> Seq.filter(fun m -> m.HasName("a")))
|> Seq.last
|> fun n -> n.AttributeValue("href")

但是,当页面中没有我正在搜索的类(class)时,我遇到了问题。特别是我收到带有消息的 ArgumentExceptions: Additional information: The input sequence was empty.
我的第一个想法是构建另一个匹配空序列并在 paging 时返回空字符串的函数。在页面上找不到类。
let findUrlOrReturnEmptyString (span:seq<HtmlNode>) =
match span with
| Seq.empty -> String.Empty // <----- This is invalid
| span -> span
|> Seq.collect(fun (n:HtmlNode) -> n.Descendants() |> Seq.filter(fun m -> m.HasName("a")))
|> Seq.last
|> fun n -> n.AttributeValue("href")

let findMaxPageNumber (page:AnHtmlPage)=
page.Html.Descendants()
|> Seq.filter(fun n -> n.HasClass("paging"))
|> findUrlOrReturnEmptyStrin

我现在的问题是 Seq.Empty不是文字,不能在模式中使用。大多数具有模式匹配的示例指定空列表 []在他们的模式中,所以我想知道:如何使用类似的方法并匹配空序列?

最佳答案

ildjarn 在评论中给出的建议是一个很好的建议:如果您觉得使用 match将创建更具可读性的代码,然后创建一个事件模式来检查空序列:

let (|EmptySeq|_|) a = if Seq.isEmpty a then Some () else None

let s0 = Seq.empty<int>

match s0 with
| EmptySeq -> "empty"
| _ -> "not empty"

在 F# Interactive 中运行它,结果将是 "empty" .

关于f# - 与空序列匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38907212/

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