我有以下代码将返回 seq
的 DownloadLink
对于这些可以解析的 URL。
type DownloadLink = { Url: string; Period: DateTime }
nodes |> Seq.map (fun n ->
let url = n.Attributes.["href"].Value
match url with
| Helper.ParseRegex "[a-zA-Z](?<period>\d{4})\.txt" [period] ->
{ Url = url; Period = period }
| _ ->
printfn "Cannot parse %s" url // Error
)
但是,我在
printfn
处收到以下错误.实现它的正确方法是什么?我应该把它变成 list option
先过滤掉这些None
项目?错误 1 类型不匹配。期待一个
字符串 -> 下载链接
但给定一个
字符串 -> 单位
“下载链接”类型与“单位”类型不匹配
最佳答案
基本的问题是,如果你有类似的东西
match x with
|true -> A
|false -> B
A
的类型和 B
必须相同。实际上有一个内置函数,它使用
Some
将 map 和过滤器结合起来。你曾经想过 - 使用 Seq.choose
像这样nodes |> Seq.choose (fun n ->
let url = n.Attributes.["href"].Value
match url with
| Helper.ParseRegex "[a-zA-Z](?<period>\d{4})\.txt" [period] ->
Some ({ Url = url; Period = period })
| _ ->
printfn "Cannot parse %s" url // Error
None
)
关于f# - 过滤并将 `list option` 转换为 `list` ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20556811/