易于阅读和理解半群的代数是什么。但对于在命令式风格语言背景下的软件开发人员来说,它仍然是一个模糊的概念。不幸的是,我的研究更多地关注指针而不是抽象代数,所以现在我的大脑几乎被命令式思维所感染了...问题是我知道定义但我不明白。它仍然不是那么明显 ,何时和为什么我想创建/提供/使用半群?!
由于一般定义( ... Semigroup可以将各种事物组合在一起...... )并没有解释好用法,请你能提供真实世界的例子 问题的形式 - 解决方案?
在答案中尽可能多地包括以下方面:append
/ combine
函数def apply: Apply[λ[α => F]]
功能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.
*/
}