gpt4 book ai didi

scala - 我如何解释 fold 和 foldK 之间的区别?

转载 作者:行者123 更新时间:2023-12-03 20:46:59 24 4
gpt4 key购买 nike

在程序员新学习函数式编程并完成猫的在线 Scala 练习的上下文中 here ,下面的结果似乎令人费解:

import cats._
import cats.implicits._

object Foo {

def main(args: Array[String]): Unit =
println(Foldable[List].fold(List(None, Option("two"), Option("three"))))
//Some("twothree")
println(Foldable[List].foldK(List(None, Option("two"), Option("three"))))
//Some("two")
}

我可以按照 fold 的示例进行操作但不适用于 foldK . documentation for foldK说:

This method is identical to fold, except that we use the universal monoid (MonoidK[G]) to get a Monoid[G[A]] instance.



我不明白这种差异如何导致上面看到的行为,其中列表中的第三个元素( Option("three") )被“忽略”为 foldK .

有人可以解释一下吗?

最佳答案

fold使用 Monoid[Option[A]] 实例,和 cats/kernel/instances/option.scalaMonoid[Option[A]].combine 有以下实现,

def combine(x: Option[A], y: Option[A]): Option[A] =
x match {
case None => y
case Some(a) =>
y match {
case None => x
case Some(b) => Some(A.combine(a, b))
}
}

但是 foldK想要一个 MoinoidK[Option]实例和这种差异的答案是在 combineK 的实现中为 Option ,

如果您查看 cats.instances.OptionInstances ,你会发现以下
  def combineK[A](x: Option[A], y: Option[A]): Option[A] = x orElse y

这应该是解释的事情。我不知道这是故意的还是只是被忽视的猫实例不一致的偏差。

关于scala - 我如何解释 fold 和 foldK 之间的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52215535/

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