如何展平选项列表

How to flatten a list of options

我现在有这段代码:

 results
 |> List.filter(Belt.Option.isSome)
 |> List.map(item =>
      switch (item) {
      | Some(item) => item
      }
    )

谁能缩短它?它是一个过滤器,用于删除无效值,然后是一个将 converts/unwraps 可选值映射为仅值的映射。

在 Scala 中它只是 flatten:

scala> List(Some("test"),None,None,Some("foo"),Some("bar"),None).flatten
res4: List[String] = List(test, foo, bar)

flatten 在 Scala 中似乎适用于任何类型的 monad。不幸的是,这种称为临时多态性的多态性在 OCaml 中不受支持(尽管它在路线图上,作为一个称为 "modular implicits" 的功能)。因此,我们必须编写特定于 listoption 的代码。仅使用 Belt,我们可以这样做:

[Some("test"), None, None, Some("foo"), Some("bar"), None]
|> Belt.List.keepMap(_, x => x)

keepMap 在 saner 标准库中被称为 filterMap,并采用一个函数,该函数应该 return 一个 option 而不是 bool 其中None 将被过滤掉,Some(x) 将被展平并作为 x.

包含在最终列表中