Использование Pipe Forward с вложенными последовательностями

Я новичок в F #, поэтому прошу прощения, если использую неправильные имена для вещей.

Я пытаюсь использовать F # для анализа веб-страницы, которая выглядит примерно так:

<!--This is simplified, in reality there are more divs, anchors etc. -->
<html>
<body> 
    <div class="pr-single"><a href="http://google.ca">Google</a></div>
    <div class="pr-single"><a href="http://apple.com">Apple</a></div>
    <div class="pr-single"><a href="http://microsoft.com">Microsoft</a></div>
</body>
</html>

Я объявил тип

type PromoterPage = FSharp.Data.HtmlProvider<"http://somewebpage.com">

А теперь пытаюсь получить список всех ссылок на странице. Мой мыслительный процесс заключался в следующем:

  1. Получить все внешние div по имени класса
  2. Получите потомков всех этих div
  3. Соберите этих потомков в плоский список
  4. Отфильтруйте этот список только до <a> тегов

Моя попытка приведена ниже:

let GetFirst (page:PromoterPage) = 
    page.Html.Descendants()
    |> Seq.filter(fun n -> n.HasClass("pr-single"))                 //Find the divs
    |> Seq.map(fun n -> n.Descendants())                            //Get the descendants
    |> Seq.collect(fun n -> n |> Seq.where(fun m -> m.HasName("a")) //Filter and collect the anchors

Проблема, похоже, в том, что вы не можете вкладывать Seq функции или что я делаю это неправильно. Я получаю сообщение об ошибке:

Incomplete values or function definition. If this is an expression, the body of the expression must be indented to the same column as the keyword.

Могу ли я вложить Seq функции так, как я пытаюсь это сделать? Я неправильно об этом думаю?


person JoshVarty    schedule 04.08.2016    source источник


Ответы (1)


Вам не хватает закрывающих скобок:

|> Seq.collect(fun n -> n |> Seq.where(fun m -> m.HasName("a")))

Могу ли я вложить функции Seq так, как я пытаюсь сделать здесь?

Да, вполне нормально вкладывать функции с конвейером в лямбда-выражения. Однако я часто вытаскиваю их в локальные функции, так как это может сделать код более читабельным в долгосрочной перспективе.

person Reed Copsey    schedule 04.08.2016
comment
Вау, это неловко. :) Спасибо! - person JoshVarty; 05.08.2016