4

很容易阅读和理解 Semigroup 的代数什么。但是对于具有命令式语言背景的软件开发人员来说,这仍然是一个模糊的概念。不幸的是,我的研究更多地关注指针而不是抽象代数,所以现在我的大脑几乎被命令式思维所感染......问题是我知道定义但我不明白。我想在哪里何时以及为什么创建/提供/使用半组仍然不是很明显?!

由于一般定义(... Semigroup 可以将事物组合在一起...)没有很好地解释用法,请您以问题解决方案的形式提供现实世界的示例吗?

在答案中,请尽可能包括以下方面:
  • 使用append/combine函数
  • 组成半群
  • 有什么def apply: Apply[λ[α => F]]作用
  • (这些来自spire-math - 一个所依赖的库)
    • AdditiveSemigroup[A]
    • MultiplicativeSemigroup[A]
    • CommutativeSemigroup[A]
    • AdditiveCommutativeSemigroup[A]
    • MultiplicativeCommutativeSemigroup[A]
    • Band[A]- 这是幂等半群
  • 上面提到的用途是什么
  • 你使用什么依赖于半组的函数/组合器(可能是函数形式,def f[A: Semigroup)(a: A) ...所以他们认为Semigroup是类型类并使用它的行为)
  • 您知道哪些半群以及它们在上述函数的上下文中的行为方式
  • [其他方面因为我没看懂题目所以没能提到]

热烈欢迎所有(部分)答案!:)

来自scalazcats的 Semigroup 特征的合并片段:

trait Semigroup[F]  { self =>

  def append(f1: F, f2: => F): F //scalaz
  def combine(x: A, y: A): A     //equivalent of `append` in cats

  // derived functions

  def multiply1(value: F, n: Int): F   //scalaz
  def compose: Compose[λ[(α, β) => F]] //scalaz
  def apply: Apply[λ[α => F]] //scalaz; `λ[α => F]` is the same as `({type λ[α] = α => F})#λ`
  def combineN(a: A, n: Int): A   //cats
  def combineAllOption: Option[A] //cats


  /** Lawes of semigroup - from scalaz:
   * A semigroup in type F must satisfy two laws:
    *
    *  - '''closure''': `∀ a, b in F, append(a, b)` is also in `F`. This is enforced by the type system.
    *  - '''associativity''': `∀ a, b, c` in `F`, the equation `append(append(a, b), c) = append(a, append(b , c))` holds.
   */
}
4

0 回答 0