filtering - 如何展平选项列表
问题描述
我现在有这段代码:
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)
解决方案
flatten
在 Scala 中似乎适用于任何类型的单子。不幸的是,OCaml 不支持这种称为 ad-hoc 多态性的多态性(尽管它在路线图上,作为一种称为“模块化隐式”的功能)。因此,我们必须编写特定于list
s 的代码option
。使用 just Belt
,我们可以这样做:
[Some("test"), None, None, Some("foo"), Some("bar"), None]
|> Belt.List.keepMap(_, x => x)
keepMap
是filterMap
在 saner 标准库中调用的函数,它采用一个应该返回 anoption
而不是a 的函数,bool
其中 aNone
将被过滤掉,Some(x)
并将被展平并包含在最终列表中x
。
推荐阅读
- javascript - 如何根据打字稿类型创建数组,但不使用枚举类型
- c# - 将包含字符串数组的 Gremlin 结果映射到包含简单字符串属性的 C# 类
- python - Django:列出序列化程序
- elasticsearch - 无法创建弹性搜索映射或使日期字段工作
- u-sql - usql中的单字母函数
- swift - 将本地 Swift Package 目标添加到现有 Xcode 项目
- c# - C#按方法调用资源
- mysql - MYSQL Group 在一个表中并与另一个表中的数字相乘
- c# - 不稳定的球员运动
- c++ - 用于记录库要求的 C++/autoconf 等效于 requirements.txt 是什么?