f# - 过滤并将 `list option` 转换为 `list` ?

标签 f#

我有以下代码将返回 seqDownloadLink对于这些可以解析的 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/

相关文章:

f# - F# 中的重写构造函数

recursion - 创建序列序列导致 StackOverflowException

f# - FSharp 提供的构造函数参数

types - 如何在 F# 中自动执行 map 查找链?

recursion - F# 递归行为

c# - 如何在C#中折叠一棵n叉树

F# 循环依赖与消息处理

docker - 在使用 Paket 从项目构建的 Docker 镜像中找不到 Microsoft.AspNetCore.App 2.2.7

f# - if-then 语句的功能替代是什么?

F# map 问题