首页 > 解决方案 > 如何在 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]]

使用

  1. 没有额外的依赖
  2. scalaz-zio-interop-catscats
  3. scalaz-zio-interop-scalaz7xscalaz7x

解决方案应该很好地推广到 n 个参数。

标签: scalascalazscala-catsscalaz7zio

解决方案


对于猫,您可以使用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 */)

推荐阅读