[英]Difference between Semigroup and SemigroupK
在猫中,有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[_]
, Semigroup[T[A]] for some A
同时拥有SemigroupK[T]
和 Semigroup[T[A]] for some A
您会得到什么?
编辑
现在存在删除MonoidK和SemigroupK的问题: https : //github.com/typelevel/cats/issues/1932
有一两件事你可以做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
一样。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.