如何展平选项列表
How to flatten a list of options
我现在有这段代码:
results
|> List.filter(Belt.Option.isSome)
|> List.map(item =>
switch (item) {
| Some(item) => item
}
)
谁能缩短它?它是一个过滤器,用于删除无效值,然后是一个将 converts/unwraps 可选值映射为仅值的映射。
在 Scala 中它只是 flatten
:
scala> List(Some("test"),None,None,Some("foo"),Some("bar"),None).flatten
res4: List[String] = List(test, foo, bar)
flatten
在 Scala 中似乎适用于任何类型的 monad。不幸的是,这种称为临时多态性的多态性在 OCaml 中不受支持(尽管它在路线图上,作为一个称为 "modular implicits" 的功能)。因此,我们必须编写特定于 list
或 option
的代码。仅使用 Belt
,我们可以这样做:
[Some("test"), None, None, Some("foo"), Some("bar"), None]
|> Belt.List.keepMap(_, x => x)
keepMap
在 saner 标准库中被称为 filterMap
,并采用一个函数,该函数应该 return 一个 option
而不是 bool
其中None
将被过滤掉,Some(x)
将被展平并作为 x
.
包含在最终列表中
我现在有这段代码:
results
|> List.filter(Belt.Option.isSome)
|> List.map(item =>
switch (item) {
| Some(item) => item
}
)
谁能缩短它?它是一个过滤器,用于删除无效值,然后是一个将 converts/unwraps 可选值映射为仅值的映射。
在 Scala 中它只是 flatten
:
scala> List(Some("test"),None,None,Some("foo"),Some("bar"),None).flatten
res4: List[String] = List(test, foo, bar)
flatten
在 Scala 中似乎适用于任何类型的 monad。不幸的是,这种称为临时多态性的多态性在 OCaml 中不受支持(尽管它在路线图上,作为一个称为 "modular implicits" 的功能)。因此,我们必须编写特定于 list
或 option
的代码。仅使用 Belt
,我们可以这样做:
[Some("test"), None, None, Some("foo"), Some("bar"), None]
|> Belt.List.keepMap(_, x => x)
keepMap
在 saner 标准库中被称为 filterMap
,并采用一个函数,该函数应该 return 一个 option
而不是 bool
其中None
将被过滤掉,Some(x)
将被展平并作为 x
.