我现在有这段代码:
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)
答案 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)
的形式包含在最终列表中。