将集合列表缩减为单值单位

Reduce a Collection List to single value Unit

我必须使用 List[Unit] 类型的值,我该怎么做才能将其减少为 Unit

 def insertMany(users: List[User]) : IO[Unit] =
    lines.map(line => createorUpdate(user))
      .transact(xa)


def createorUpdate(user: User): ConnectionIO[Unit] =
    sql"""
          INSERT INTO $tableName ($columns)
          VALUES (${user.id}, ${user.age}, NOW(), NOW())
          ON CONFLICT DO NOTHING"""
      .update.run
      .map(_ => ())

这是完整的定义 我遇到了一个错误:

value transact is not a member of List[doobie.ConnectionIO[Unit]]
                       [error] possible cause: maybe a semicolon is missing before `value transact'?
                       [error]       .transact(xa)
                       [error]        ^
                       [error] one error found

听起来您正在寻找 [updateMany][1],但有时这行不通。

如果您想让您的代码正常工作,您需要将 transact 应用到 IO

所以它必须是这样的:

def insertMany(lines: List[String]) : IO[Unit] =
    lines.map(line => createorUpdate(line)).sequence_.transact(xa)

sequence 基本上从 List[IO[your_type]] 变为 IO[List[your_type]]...

当您有 mapsequence_ 时,您总是可以转换为 traverse,所以这也可以工作

def insertMany(lines: List[String]) : IO[Unit] =
  lines.traverse_(line => createorUpdate(line)).transact(xa)