很容易阅读和理解 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
是类型类并使用它的行为) - 您知道哪些半群以及它们在上述函数的上下文中的行为方式
- [其他方面因为我没看懂题目所以没能提到]
热烈欢迎所有(部分)答案!:)
来自scalaz和cats的 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.
*/
}