Cats 的 Monoid 实例在合并数组映射时抛出异常
Cats' Monoid instance throws exception when merging Maps of Arrays
我为 Map[Int, Array[Int]]
定义了一个 Monoid 实例,并试图用它来合并这样的映射列表:
import cats.Monoid
import cats.implicits._
implicit val m: Monoid[Map[Int, Array[Int]]] = Monoid[Map[Int, Array[Int]]]
List(
Map(
(0 -> Array(8, 9))
),
Map(
(0 -> Array(10))
),
Map(
(1 -> Array(30))
),
).foldMap(identity)
我希望输出是这样的:
Map(
(0 -> Array(8, 9, 10),
(1 -> Array(30),
)
但是,代码抛出以下异常:
[error] java.lang.NullPointerException
[error] at cats.instances.ListInstances$$anon.foldMap(list.scala:74)
[error] at cats.instances.ListInstances$$anon.foldMap(list.scala:16)
[error] at cats.Foldable$Ops.foldMap(Foldable.scala:31)
[error] at cats.Foldable$Ops.foldMap$(Foldable.scala:31)
[error] at cats.Foldable$ToFoldableOps$$anon.foldMap(Foldable.scala:31)
我尝试使用 .reduce(_ |+| _)
或 m.combineAll
而不是 .foldMap(identity)
,结果相同。
我做错了什么?
要使您的代码正常工作,您只需为数组提供适当的 Monoid:
//we also need ClassTag because we don't know type yet and arrays aren't generic
implicit def arrayMonoid[T: ClassTag]: Monoid[Array[T]] = new Monoid[Array[T]] {
override def empty: Array[T] = Array[T]()
override def combine(x: Array[T], y: Array[T]): Array[T] = x ++ y
}
Cats 库默认不为数组提供 Monoid。
我为 Map[Int, Array[Int]]
定义了一个 Monoid 实例,并试图用它来合并这样的映射列表:
import cats.Monoid
import cats.implicits._
implicit val m: Monoid[Map[Int, Array[Int]]] = Monoid[Map[Int, Array[Int]]]
List(
Map(
(0 -> Array(8, 9))
),
Map(
(0 -> Array(10))
),
Map(
(1 -> Array(30))
),
).foldMap(identity)
我希望输出是这样的:
Map(
(0 -> Array(8, 9, 10),
(1 -> Array(30),
)
但是,代码抛出以下异常:
[error] java.lang.NullPointerException
[error] at cats.instances.ListInstances$$anon.foldMap(list.scala:74)
[error] at cats.instances.ListInstances$$anon.foldMap(list.scala:16)
[error] at cats.Foldable$Ops.foldMap(Foldable.scala:31)
[error] at cats.Foldable$Ops.foldMap$(Foldable.scala:31)
[error] at cats.Foldable$ToFoldableOps$$anon.foldMap(Foldable.scala:31)
我尝试使用 .reduce(_ |+| _)
或 m.combineAll
而不是 .foldMap(identity)
,结果相同。
我做错了什么?
要使您的代码正常工作,您只需为数组提供适当的 Monoid:
//we also need ClassTag because we don't know type yet and arrays aren't generic
implicit def arrayMonoid[T: ClassTag]: Monoid[Array[T]] = new Monoid[Array[T]] {
override def empty: Array[T] = Array[T]()
override def combine(x: Array[T], y: Array[T]): Array[T] = x ++ y
}
Cats 库默认不为数组提供 Monoid。