F # взять элементы из последовательности - PullRequest
1 голос
/ 26 апреля 2011

Я пытаюсь выучить F #

То, что я хотел бы сделать, это загрузить веб-страницу, разбить ее на последовательность, затем найти индекс элемента и взять следующие 3 элемента после него.

Вот код - может кто-нибудь показать мне, что я делаю не так, пожалуйста?

let find = "<head>"
let page = downloadUrl("http://www.stackoverflow.com")
let lines = seq (  page.Replace("\r", System.String.Empty).Split([|"\n"|],   StringSplitOptions.RemoveEmptyEntries)  )
let pos = lines |> Seq.findIndex(fun a -> a == find) // getting a Exception of type 'System.Collections.Generic.KeyNotFoundException' was thrown.
let result = // now to get the next 3 items
printfn "%A" (Seq.toList result);;

Ответы [ 2 ]

3 голосов
/ 26 апреля 2011

Итак, вы делаете некоторую обработку текста F #. Вот несколько возможных проблем:

  1. После того, как вы загрузили страницу HTML, вы не делали никакой предварительной обработки, скажем, удалите все теги HTML.

  2. page.Replace("\r", System.String.Empty).Split([|"\n"|] проблематично, потому что я думаю, что вы хотите разделить элементы / слова. Эта линия только разбивает строки.

  3. let pos = lines |> Seq.findIndex(fun a -> a == find) изменить == на =. В F # = - логический оператор для сравнения.

  4. let result = lines |> Seq.take pos принимает только первые pos предметы. Вы должны пропустить эти предметы и затем взять pos предметов как в:

.

lines
|> Seq.skip (pos+1)
|> Seq.take 3
2 голосов
/ 26 апреля 2011
let result = lines |> Seq.take pos

Эта строка пропускает все до найденного предмета, а не берет 3 предмета после него.

РЕДАКТИРОВАТЬ: Seq.findIndex не удается, если искомый элемент не существует. Вы хотите Seq.tryFindIndex:

match lines |> Seq.tryFindIndex(fun a -> a == find) with
| Some pos -> let result = // now to get the next 3 items
              printfn "%A" (Seq.toList result)
| None     -> ()
...