在猫中有2个半群类型:Semigroup
和SemigroupK
,后者在类型构造函数上工作。
我没有看到后者优于前者的优势。如果我查看他们提供的列表实例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
答案 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
一样。