Scala中两次Foldable.fold调用为何第二个出现编译错误?
问题原因与解决方案
问题根源
两段代码的核心差异在于类型推断结果不同:
- 第一行的
somes被显式声明为List[Option[Int]],编译器能找到Monoid[Option[Int]]的实例(Cats默认提供了Option的Monoid实现,基于内部元素的Monoid逻辑合并)。 - 第二行直接写
List(Some(1), Some(2))时,Scala编译器会把列表元素类型推断为最具体的Some[Int],而非Option[Int]。而Cats并没有为Some这个子类提供Monoid实例,因此报错找不到Monoid[Some[Int]]。
修复方案
有两种简单的修复方式:
- 显式指定列表类型:
Foldable[List].fold(List[Option[Int]](Some(1), Some(2)))
- 用
Option构造器替代Some:
Foldable[List].fold(List(Option(1), Option(2)))
两种方式都会让编译器将列表类型推断为List[Option[Int]],匹配到正确的Monoid实例,代码即可正常编译执行。
内容的提问来源于stack exchange,提问作者liveinwood
相关产品推荐
相关产品推荐

