与某些类型不匹配

type mismatch with some

我有以下函数定义:

def addMonoid[A](items: List[A])(implicit monoid: Monoid[A]) =
  items.foldLeft(monoid.empty)((a, b) => monoid.combine(a, b))

当我尝试按如下方式使用它时:

add(List(Some(1), Some(2), Some(3)))

我有:

Error:(35, 15) type mismatch;
 found   : Some[Int]
 required: Int
add(List(Some(1), Some(2), Some(3)));}
         ^

怎么了?

由于定义了 Monoid[Option],而不是 Monoid[Some],cats 未在范围内找到隐式。如果你使用 sugar cats 提供的 some 语法来推断 Option[A],这将起作用:

def addMonoid[A: Monoid](items: List[A]) =
  items.foldLeft(Monoid[A].empty)((a, b) => Monoid[A].combine(a, b))

addMonoid(List(1.some, 2.some, 3.some)).foreach(println)

产量

6

也可以直接在cats中使用Monoid

import cats._
import cats.implicits._
Monoid[Option[Int]].combineAll(List(Some(1), Some(2), Some(3)))