【问题标题】:List to multiple anonymous/underscore parameters in for-comprehension列出多个匿名/下划线参数以供理解
【发布时间】:2018-06-27 17:39:51
【问题描述】:

我是 Scala/函数式的新手,所以我还不能使用技术语言。

我在理解方面遇到问题

 val queries =
for {
  _ <- createBanco
  _ <- createBancoMedio
  bankInsertions  <- Update[Banco](insertStr).updateMany(NonEmptyList.fromList(createBankList(1, maxBanks)).get)
  mediumInsertions  <- Update[BancoMedio](mediumInsert).updateMany(NonEmptyList.fromList(mediumList).get)
  bankCount <- BancoStatements.getCount().unique
  bankGetIds <- BancoStatements.getIds(0, maxBanks).to[List]
  bankSome <- BancoStatements.getSome(halfBanks).to[List]
} yield (bankCount, bankGetIds, bankSome)

//Execute database queries, saves them on tuple
val transactionResults : (Int, List[String], List[Banco]) = 
queries.transact(h2Transactor).unsafeRunSync()

我正在尝试重构 _

我想将它们转换为单个 List(createBanco, createBancoMedio),然后执行交易。

但是,我会通过这样做来改变理解的返回类型。我想知道是否有任何方法可以在不影响 for 输出值的情况下做到这一点

基本上,将列表视为手动编写多个匿名参数。

【问题讨论】:

    标签: scala functional-programming for-comprehension doobie


    【解决方案1】:

    如果G 具有Applicative 实例,您可以使用.sequenceList[G[A]] 转换为G[List[A]],而ConnectionIO 可以:

    val queries =
    for {
      _ <- List(createBanco, createBancoMedio).sequence
      ...
    

    【讨论】:

    • 我不得不按顺序指定 G 和 A,但工作起来就像一个魅力。谢谢! (.sequence[ConnctionIO, Int] )
    【解决方案2】:

    刚刚解决了,又为理解列表做了另一个

    val createList = for {
      m <- createBancoMedio
      b <- createBanco
    } yield List(b, m)
    
    val queries =
    for {
      _ <- createList ....
    

    这样我就有了 ConnectionIO[List[Int]]

    【讨论】: