Это был не ваш вопрос, но если вы заинтересованы в более функциональном подходе, вот один из способов сделать это:
type Crawler =
{ Urls : Set<string> }
[<CompilationRepresentation(CompilationRepresentationFlags.ModuleSuffix)>]
module Crawler =
[<CompiledName("Start")>]
let start crawler (url:string) =
let { Urls = oldUrls } = crawler
let newUrls =
HtmlWeb().Load(url).DocumentNode.SelectNodes(".//a")
|> Seq.cast<HtmlNode>
|> Seq.choose (fun link ->
match link.GetAttributeValue("href"," ") with
| href when href.StartsWith("http://") && href.EndsWith(".html") -> Some href
| _ -> None)
|> Set.ofSeq
|> Set.union oldUrls
{ crawler with Urls = newUrls }
Ваши данные и поведение теперь разделены.Crawler
является неизменяемым типом записи.start
принимает Crawler
и возвращает новый с обновленным списком URL.Я заменил Dictionary
на Set
, поскольку ключи и значения одинаковы;устранены неиспользуемые let
привязки, а также прокрутка в некотором сопоставлении с образцом.Это также должно иметь относительно дружественный интерфейс в C #.