Je suis nouveau sur F # et fonctionnel et je travaille sur du code d'analyse HTML. Je souhaite supprimer d'un document HTML les éléments correspondant à certains critères. Ici, j'ai une séquence d'objets (HtmlNodes) et je veux les retirer du document.Est-ce que cette utilisation correcte de la correspondance de motif et des motifs actifs est correcte?
Est-ce une façon idiomatique d'utiliser la correspondance de formes? De même que HtmlNode.Remove() a un effet secondaire sur l'objet HtmlDocument d'origine, existe-t-il un moyen particulier de structurer le code pour rendre l'effet secondaire évident ou comment cela devrait-il être géré. Vous pouvez être aussi pédant que vous le souhaitez avec le code.
open HtmlAgilityPack
let removeNodes (node : HtmlNode) =
let (|HiddenNodeCount|) (n : HtmlNode) =
match n.SelectNodes("*[@style[contains(.,'visibility:hidden')]]") with
| null -> 0
| _ as x -> Seq.length x
match node with
| x when x.Name.ToLower() = "script" -> node.Remove()
| x when x.NodeType = HtmlNodeType.Comment -> node.Remove()
| HiddenNodeCount x when x > 0 -> node.Remove()
| _ ->()
let html = "some long messy html code would be here"
let dom = new HtmlDocument(OptionAutoCloseOnEnd=true)
dom.LoadHtml(html)
let nodes = dom.DocumentNode.DescendantNodes()
nodes |> Seq.toArray |> Array.iter removeNodes
+1 dans ce cas particulier, le modèle 'if cond then true elif ...' peut être transformé en 'cond ||'. Le résultat est au moins aussi lisible (pour moi). –
bonne idée, je l'ai ajouté à la fin comme un edit (en laissant mon implémentation originale de shouldRemoveNode la même chose afin qu'elle s'aligne avec l'exemple Active Pattern). –
Ce fut une réponse très utile tout au long, merci. Le modèle actif et la façon dont le code est séparé pour les effets secondaires est beaucoup mieux. – yanta