Semigroup和SemigroupK之间的差异

时间:2016-11-07 09:56:00

标签: scala scala-cats

在猫中有2个半群类型:SemigroupSemigroupK,后者在类型构造函数上工作。 我没有看到后者优于前者的优势。如果我查看他们提供的列表实例Monoid(尽管有MonoidK),而NonEmptyList则提供SemigroupK。请注意,NonEmptyList还通过以下方法提供Semigroup

implicit def catsDataSemigroupForNonEmptyList[A]: Semigroup[NonEmptyList[A]] =
  SemigroupK[NonEmptyList].algebra[A]

为何出现差异?

然后似乎大多数半群操作仅在Semigroup而不是SemigroupK上可用(reduceK中有Reducible,但这是我看到的唯一一个,它代表致reduce)的Semigroup

因此,给定T[_]类型,您可以通过SemigroupK[T] Semigroup[T[A]] for some A来获得什么?

修改

现在有一个问题需要删除MonoidK和SemigroupK:https://github.com/typelevel/cats/issues/1932

1 个答案:

答案 0 :(得分:0)

SemigroupK使用Semigroup无法做的一件事就是为Nested撰写实例:

implicit def catsDataSemigroupKForNested[F[_]: SemigroupK, G[_]]: SemigroupK[Nested[F, G, ?]]

如果您尝试为Semigroup编写等效内容,我认为您最接近的是

implicit def catsDataSemigroupForNested[F[_], G[_], A](implicit sg: Semigroup[F[G[A]]]): Semigroup[F[G[A]]] // or Semigroup[Nested[F, G, A]]

这不是很有用!在搜索中,我看不到为SemigroupK实现的任何其他内容以及无法使用Semigroup,但我可能错过了一些内容。

SemigroupK的要点是,一旦拥有它,您也可以自动获得Semigroup,就像NonEmptyList一样。