gpt4 book ai didi

scala - 减少/折叠幺半群列表但减少器返回任一

转载 作者:行者123 更新时间:2023-12-04 18:00:40 30 4
gpt4 key购买 nike

我发现自己遇到过几次我有一个 reducer /组合 fn 的情况,如下所示:

  def combiner(a: String, b: String): Either[String, String] = {
(a + b).asRight[String]
}

它是一个虚拟实现,但 fn 可能会失败,因此它返回一个。然后我有一个值列表,我想通过减少/折叠来传递它。我能想到的最好的(假设 List 的类型是幺半群)是这样的:
  def combine(items: Vector[String]) = {

items.foldLeft(Monoid[String].empty.asRight[String]) { case (acc, value) =>
acc.flatMap( accStr => combiner(accStr, value))
}
}

它有点笨拙,而且由于它是一种相当通用的模式,我怀疑有更好的方法可以使用猫来做到这一点。

最佳答案

您可能想看看 foldM .您的代码将大致如下所示:

Foldable[Vector].foldM(items, "")(combiner)
foldM方法有签名
def foldM[G[_], A, B](fa: F[A], z: B)(f: (B, A) ⇒ G[B])(implicit G: Monad[G]): G[B]

所以在你的情况下, type(-constructor) 参数将统一如下:
  • G[X] = Either[String, ?]
  • A = String
  • B = String
  • F[X] = Vector[X]

  • 以便 f: (A, B) => G[B]会变成 f: (String, String) => Either[String, String] ,这正是 combiner 的类型当它被转换成一个函数时。

    关于scala - 减少/折叠幺半群列表但减少器返回任一,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56451987/

    30 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com