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
Это должно быть объяснением вещей. Я не знаю, предназначено ли это или просто пропущено отклонение к непоследовательности в случаях кошек.