【问题标题】:Reduce / fold over list of monoid but reducer returns Either减少/折叠幺半群列表,但减少器返回
【发布时间】:2019-06-04 22:11:38
【问题描述】:

我发现自己有几次这样的情况,我有一个减速器/组合 fn,如下所示:

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

它是一个虚拟实现,但 fn 可能会失败,因此它返回一个 any。然后我有一个值列表,我想通过 reduce / fold 传递。我能想到的最好的(假设列表的类型是一个幺半群)是这样的:

  def combine(items: Vector[String]) = {

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

它有点笨拙,因为它是一种相当通用的模式,我怀疑有更好的方法来使用猫。

【问题讨论】:

  • 您想在第一个错误时快速失败吗?或者你也想积累?

标签: scala functional-programming scala-cats


【解决方案1】:

您可能想看看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]

因此,在您的情况下,类型(-构造函数)参数将统一如下:

  • G[X] = Either[String, ?]
  • A = String
  • B = String
  • F[X] = Vector[X]

这样f: (A, B) => G[B] 将变为f: (String, String) => Either[String, String],这正是combiner 转换为函数时的类型。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-27
    • 2012-02-21
    • 2011-12-05
    • 1970-01-01
    • 2022-01-08
    • 2019-06-06
    • 1970-01-01
    相关资源
    最近更新 更多