【问题标题】:How can I extract x values from Some(x) values from a sequence of Option 'a?如何从 Option 'a 序列中的 Some(x) 值中提取 x 值?
【发布时间】:2013-09-29 05:54:58
【问题描述】:

这对我来说似乎是个脑筋急转弯。我需要从序列中提取包装到 Some(x) 中的 x 值。我可以做到这一点

xs |> Seq.fold (fun state x -> match x with -> | Some(y) -> y::state | None -> state) [] 
    |> Seq.toList 
    |> List.rev 
    |> List.toSeq

有更好的方法吗?

【问题讨论】:

    标签: f#


    【解决方案1】:

    对于实际上不是标准选项类型的可区分联合,您只需向Seq.choose 提供一个函数,该函数采用您的可区分联合实例并将其映射到标准选项。有点像...

    xs |> Seq.choose (function Nothing _ -> None | Something x -> Some x)
    

    【讨论】:

      【解决方案2】:

      这很简单

      xs |> Seq.choose id
      

      【讨论】:

      • 我得花点时间熟悉标准库:)
      • 操作!原来我需要一些不同的东西,请检查更新的问题。类似 xs |> Seq.Choose id |> Option.get // 但它不是那样工作的
      • @bonomo - 我不明白 - 这就是我得到的 [Some(5);None;Some(10)] |> Seq.choose id;; val it : seq<int> = seq [5; 10]
      • @bonomo - 我认为您没有使用标准的 Option 类型。您的 extractLinkFromNode 返回具有 Nothing 作为构造函数的内容,错误消息指的是 Optional 而不是 Option
      • 你是对的,我编了一个类似于 Option 的类型,它在 None 的情况下接受解释性消息,所以标准函数不应该使用它,duh..
      猜你喜欢
      • 2023-04-01
      • 1970-01-01
      • 2021-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多