scala - 如何在 ZIO 中优雅地组合多个包含选项的任务
问题描述
我正在寻找最优雅的实现
import scalaz.zio.Task
def combineTasks[A, B, C, D](task1: Task[Option[A]],
task2: Task[Option[B]],
task3: Task[Option[C]])
(f: (A, B, C) => D)
: Task[Option[D]]
使用
- 没有额外的依赖
scalaz-zio-interop-cats
和cats
scalaz-zio-interop-scalaz7x
和scalaz7x
解决方案应该很好地推广到 n 个参数。
解决方案
对于猫,您可以使用mapN
. 所以这会起作用:
import cats._
import cats.implicits._
val o1 = 1.some
val o2 = 2.some
val o3 = 3.some
(o1,o2,o3).mapN((a,b,c) => a |+| b |+| c) // Some(6)
剩下要做的就是解开任务,因为它们是单子,你可以这样做:
for {
t1 <- task1
t2 <- task2
t3 <- task3
} yield (t1,t2,t3)
.mapN((a,b,c) => /* combine a,b,c */)
推荐阅读
- excel - 加载项中的 Excel 宏不可见
- python - 在 Windows 平台中使用 Python 在监控模式下启用 Wifi
- javascript - 让 webpack 处理导入库中的服务工作者
- r - 数据框搜索 == 未找到所有符合条件的条件
- reactjs - 带有 ReactJS 的 VsCode:在使用“className”时是否可以自动补全双引号?
- docker - 如何在supervisord中设置环境变量
- python - 在 EOF 之后读取 Numpy fromfile
- devops - 使用 systemd 每秒准确运行计时器
- c - 是否有返回第二个、第三个等实例的 C 函数会出现 int 值?
- python - Python - 将变量分配给 json 列表