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

问题描述 投票:2回答:1

在程序员新学习函数式编程和完成Cats here的在线Scala练习的背景下,以下结果似乎令人费解:

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的例子,但不能用于foldKdocumentation for foldK说:

这个方法与fold相同,只不过我们使用通用的monoid(MonoidK[G])来获得Monoid[G[A]]实例。

我不明白这种差异会如何导致上面看到的行为,在某种程度上,Option("three")会忽略列表中的第三个元素(foldK)。

有人可以解释一下吗?

scala scala-cats
1个回答
2
投票

fold使用Monoid [Option [A]]实例,cats/kernel/instances/option.scala具有以下Monoid[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

这应该是解释的事情。我不知道这是出于意图,还是仅仅是对猫实例中不一致的偏差。

© www.soinside.com 2019 - 2024. All rights reserved.