理解半群。功能编程。斯卡拉

时间:2016-09-12 07:29:35

标签: scala functional-programming scalaz scala-cats

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

由于一般定义( ... Semigroup可以将各种事物组合在一起...... )并没有解释好用法,请你能提供真实世界的例子 问题的形式 - 解决方案

在答案中尽可能多地包括以下方面:
  • 使用append / combine函数
  • 撰写半群
  • def apply: Apply[λ[α => F]]功能
  • 是什么
  • (这些来自 spire-math - cats 依赖的库)hek是什么
    • AdditiveSemigroup[A]
    • MultiplicativeSemigroup[A]
    • CommutativeSemigroup[A]
    • AdditiveCommutativeSemigroup[A]
    • MultiplicativeCommutativeSemigroup[A]
    • Band[A] - 这是幂等半群
  • 上面提到的用法
  • 您使用哪些函数/组合器依赖于半群(可能以def f[A: Semigroup)(a: A) ...的形式运行,因此他们将Semigroup视为类型类并使用它的行为)
  • 你知道哪些半群以及他们在上述功能的背景下的表现
  • [我无法提及的其他方面因为我不理解这个话题]

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

来自 scalaz 的合并片段的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.
   */
}

0 个答案:

没有答案