我想学习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);;
答案 0 :(得分:3)
所以你正在做一些F#文本处理。以下是一些可能的问题:
下载HTML页面后,您没有进行任何预处理,例如删除所有HTML标记。
page.Replace("\r", System.String.Empty).Split([|"\n"|]
是有问题的,因为我猜您要将项目/单词拆分出来。这条线只分出线。
let pos = lines |> Seq.findIndex(fun a -> a == find)
将==
更改为=
。在F#中,=
是用于比较的布尔运算符。
let result = lines |> Seq.take pos
只接受第一个pos
项。您应该跳过这些项目,然后按照以下内容获取pos
项目:
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 -> ()