如何拼合选项列表

时间:2019-04-14 23:09:32

标签: filtering optional reason bucklescript

我现在有这段代码:

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

有人可以缩短它的时间吗?这是一个过滤器,用于删除无效值,然后删除将可选值转换/解包为正值的映射。

在Scala中,它只是flatten

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

1 个答案:

答案 0 :(得分:2)

flatten在Scala中似乎适用于任何一种monad。不幸的是,OCaml不支持这种称为即席多态的多态性(尽管它在路线图上,称为“模块化隐式”功能)。因此,我们必须编写特定于list的{​​{1}}的代码。仅使用option,我们可以做到这一点:

Belt

[Some("test"), None, None, Some("foo"), Some("bar"), None] |> Belt.List.keepMap(_, x => x) 在更高级的标准库中称为keepMap,它采用的函数应返回filterMap而不是option,其中bool将被过滤掉,None将被展平并仅以Some(x)的形式包含在最终列表中。