首页 > 解决方案 > 如何展平选项列表

问题描述

我现在有这段代码:

 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)

标签: filteringoptionalreasonbucklescript

解决方案


flatten在 Scala 中似乎适用于任何类型的单子。不幸的是,OCaml 不支持这种称为 ad-hoc 多态性的多态性(尽管它在路线图上,作为一种称为“模块化隐式”的功能)。因此,我们必须编写特定于lists 的代码option。使用 just Belt,我们可以这样做:

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

keepMapfilterMap在 saner 标准库中调用的函数,它采用一个应该返回 anoption而不是a 的函数,bool其中 aNone将被过滤掉,Some(x)并将被展平并包含在最终列表中x


推荐阅读