5

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

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

为什么会出现差异?

然后似乎大多数半组操作仅在而不Semigroup可用SemigroupK(有但这是我看到的唯一一个,它委托给哪个工作 on )。reduceKReduciblereduceSemigroup

那么,给定一个 type T[_],同时拥有 aSemigroupK[T] a会得到Semigroup[T[A]] for some A什么?

编辑

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

4

1 回答 1

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

于 2016-11-07T18:35:57.123 回答