F#从序列中获取项目

时间:2011-04-26 05:48:05

标签: f# sequence take

我想学习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 个答案:

答案 0 :(得分:3)

所以你正在做一些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项目:

  5. lines
    |> Seq.skip (pos+1)
    |> Seq.take 3
    

答案 1 :(得分:2)

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     -> ()