2016-08-04 29 views
2

Ich bin brandneu zu F #, also entschuldige ich mich, wenn ich die falschen Namen für Dinge verwende.Verwenden von Pipe Forward mit verschachtelten Sequenzen

Ich versuche, F # zu verwenden, um eine Webseite zu analysieren, die etwa wie folgt aussieht:

<!--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> 

ich einen Typen

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

erklärt habe und jetzt ich versuche zu bekommen eine Liste aller Links auf der Seite. Mein Denkprozess war:

  1. Holen Sie sich alle äußeren divs von Klassennamen
  2. Holen Sie sich die Nachkommen aller dieser divs
  3. diese Nachkommen in eine flache Liste sammeln
  4. Filter diese Liste nach unten nur zu <a> Tags

bei dieser Mein Versuch ist unter:

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 

Das Problem scheint zu sein, dass Sie Seq Funktionen nicht verschachteln können oder dass ich es nicht richtig mache. Ich erhalte die Fehlermeldung:

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.

Kann ich Nest Seq Funktionen so, wie ich hier bin versucht? Denke ich darüber falsch?

Antwort

5

Sie verpassen die Schließung Klammern:

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

Can I nest Seq functions the way I'm trying to here?

Ja, es ist völlig in Ordnung zu nisten Funktionen mit Rohrleitungen in lambdas. Allerdings ziehe ich sie oft in lokale Funktionen, da sie den Code auf lange Sicht besser lesbar macht.

+0

Wow, das ist peinlich. :) Vielen Dank! – JoshVarty