【问题标题】:Difference between Semigroup and SemigroupKSemigroup和SemigroupK之间的区别
【发布时间】:2018-02-14 18:47:36
【问题描述】:

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

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

为什么会出现差异?

然后似乎大多数半群操作仅在 Semigroup 上可用,而不是在 SemigroupK 上(Reducible 中有 reduceK,但这是我看到的唯一一个,它委托给 reduce,它适用于 @ 987654339@)。

那么,给定一个 T[_] 类型,如果同时拥有 SemigroupK[T]Semigroup[T[A]] for some A,你会得到什么?

编辑

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

【问题讨论】:

  • 据我所知,猫在0.8 中为ListNonEmptyList 提供了一个SemigroupK。如果您看一下catsStdInstancesForList,其中的MonadCombine 扩展了SemigroupK
  • @jilen 我读了这篇文章,但它并没有真正回答我的问题
  • @DenisRosca 我在 cat 0.7.2 上看到了这一点,所以它可能是在以后的版本中添加的,这仍然让我想知道你通过这两个类型类获得了什么?
  • 供将来参考:SemigroupSemigroupK 的 Cats 文档。

标签: scala scala-cats


【解决方案1】:

你可以用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 一样。

【讨论】:

  • 好的,所以我猜Nested 和语义稍有不同的<+> 运算符是迄今为止的两个原因。但是当你说一旦你得到一个SemigroupK你就可以得到一个Semigroup,我宁愿说一旦你得到了SemigroupK必须得到一个Semigroup,否则它不会'没有多大用处(所以我不会称其为功能)。
  • 不,您可以直接使用SemigroupK 而无需获得Semigroup:这就是<+> 的用途。 (我个人会考虑 <+>|+| 之间的不匹配,就像 Option 必须是一个小错误,可能不值得摆脱,不是使用 SemigroupK 的理由;但我猜这个实例Semigroup 是在 SemigroupK 存在之前添加的。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-25
  • 2020-05-10
  • 2014-09-20
  • 2010-10-28
  • 2015-10-04
  • 2012-08-12
  • 2011-02-18
相关资源
最近更新 更多