Я изучаю F #, и я начал играть с обеими последовательностями и выражениями match
.Соответствие с пустой последовательностью
Я пишу веб-скребок, который просматривает HTML, аналогичный следующему и беря последний URL-адрес в родительском <span>
с классом paging
.
<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
не является буквальным и не могут быть использованы в шаблоне. Большинство примеров с сопоставлением с образцом задают пустые списки []
в своих шаблонах, поэтому мне интересно: как использовать подобный подход и сопоставлять пустые последовательности?
Просто используйте 'if .. else' здесь; «матч» просто усложняет ситуацию. ('if Seq.isEmpty span then" "else ...') – ildjarn
Пример был упрощен, в моем конвейере есть несколько мест, когда мне нужно будет добавлять 'if-else'. Поскольку я новичок в F #, я в основном задаюсь вопросом, есть ли подходящий способ сопоставления пустых последовательностей, поскольку кажется, что это соответствует пустым последовательностям. – JoshVarty
Если это распространено в коде _your_, и вы твердо придерживаетесь 'match', тогда создайте для него активный шаблон. – ildjarn