我现在有这段代码:
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)
Scala中的flatten
似乎适用于任何类型的monad。不幸的是,OCaml不支持这种称为ad-hoc多态的多态性(虽然它在路线图上,称为“模块化含义”)。因此,我们必须编写特定于list
s的option
s的代码。使用Belt
,我们可以这样做:
[Some("test"), None, None, Some("foo"), Some("bar"), None]
|> Belt.List.keepMap(_, x => x)
keepMap
在saner标准库中被称为filterMap
,并且需要一个函数应该返回option
而不是bool
,其中None
将被过滤掉并且Some(x)
将被展平并且被包括在最终列表中仅仅是x
。