Semigroup和SemigroupK之间的差异

Bru*_*eth 5 scala scala-cats

在猫有2个半群类型的类:SemigroupSemigroupK与类型构造后者的工作.我没有看到后者优于前者的优势.如果我查看他们提供的列表实例Monoid(虽然有一个MonoidK),而是NonEmptyList提供一个SemigroupK.注意,NonEmptyList还提供了一个Semigroupvia以下方法:

implicit def catsDataSemigroupForNonEmptyList[A]: Semigroup[NonEmptyList[A]] =
  SemigroupK[NonEmptyList].algebra[A]
Run Code Online (Sandbox Code Playgroud)

为什么会出现差异?

然后似乎大多数半群操作只能在Semigroup和不可用SemigroupK(有reduceK,Reducible但这是我看到的唯一一个,并且它代表reduce哪个工作Semigroup).

那么,给定一种类型T[_],你会因为同时拥有a SemigroupK[T] a 获得Semigroup[T[A]] for some A什么?

编辑

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

Ale*_*nov 0

您可以做但SemigroupK不能做的一件事Semigroup是为 组合实例Nested

implicit def catsDataSemigroupKForNested[F[_]: SemigroupK, G[_]]: SemigroupK[Nested[F, G, ?]]
Run Code Online (Sandbox Code Playgroud)

如果你尝试写一个等价的Semigroup,我认为你会得到的最接近的是

implicit def catsDataSemigroupForNested[F[_], G[_], A](implicit sg: Semigroup[F[G[A]]]): Semigroup[F[G[A]]] // or Semigroup[Nested[F, G, A]]
Run Code Online (Sandbox Code Playgroud)

这不是很有用!从搜索中,我看不到任何其他已实现SemigroupK无法使用 完成的内容Semigroup,但我可能错过了一些东西。

但要点SemigroupK是,一旦你拥有了它,你就可以自动获得一个Semigroup太,就像一样NonEmptyList