私は F# を学んでいて、シーケンスとmatch
式の両方をいじり始めました。
私は、次のような HTML を調べて<span>
、paging
クラスを持つ親の最後の URL を取得する Web スクレイパーを作成しています。
<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")
ただし、検索しているクラスがページにない場合、問題が発生します。特に、次のメッセージで 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
、リテラルではなく、パターンで使用できないことです。パターン マッチングを使用するほとんどの例では[]
、パターンに空のリストが指定されているため、疑問に思っています: 同様のアプローチを使用して空のシーケンスに一致させるにはどうすればよいでしょうか?