如何拼合选项列表

问题描述 投票:1回答:1

我现在有这段代码:

 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)
filtering optional reason bucklescript
1个回答
2
投票

Scala中的flatten似乎适用于任何类型的monad。不幸的是,OCaml不支持这种称为ad-hoc多态的多态性(虽然它在路线图上,称为“模块化含义”)。因此,我们必须编写特定于lists的options的代码。使用Belt,我们可以这样做:

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

keepMap在saner标准库中被称为filterMap,并且需要一个函数应该返回option而不是bool,其中None将被过滤掉并且Some(x)将被展平并且被包括在最终列表中仅仅是x

© www.soinside.com 2019 - 2024. All rights reserved.