与半组相比,后缀 -al 在半群中传达了什么?



存在 Semigroup 和 Semigrupal

Semigroup[Int].combine(1, 41)                  // : Int = 42
Semigroupal[Option].product(Some(1), Some(41)) // : Option[(Int, Int)] = Some(value = (1, 41))

-al 后缀意味着什么?-al 在什么意义上传达了半群和半群之间的区别?同样,还有 Monoid 和Monoid al的语言;-al 在这里传达了相同的区别吗?

edmundnoble states semigroupal 是一个缩写

半群

是半群函子的缩写,它对幺半群函子就像半群是幺半群一样

或者正如赫里诺所说

"半群函子" - "函子" = "半群">

cats.Semigroupal指向半群函子的概念,其定义如下

trait SemigroupalFunctor[F[_]] {
def product[A, B](fa: F[A], fb: F[B]): F[(A, B)]
def map[A, B](fa: F[A])(f: A => B): F[B]
}

半群函子就像没有单元的幺半群函子

trait MonoidalFunctor[F[_]] {
def unit: F[Unit]
def product[A, B](fa: F[A], fb: F[B]): F[(A, B)]
def map[A, B](fa: F[A])(f: A => B): F[B]
}

现在cats.Semigroupal是半群函子的推广,其中只有product被提取到它自己的类型类中

trait Semigroupal[F[_]] {
def product[A, B](fa: F[A], fb: F[B]): F[(A, B)]
}

因此,命名仅停止在Semigroupal而不是SemigroupalFunctor。完整的半群函子可以在猫中找到,其形式为Apply,它结合了SemigroupalFunctor,如以下简化视图所示

trait Semigroupal[F[_]] {
def product[A, B](fa: F[A], fb: F[B]): F[(A, B)]
}
trait Functor[F[_]] {
def map[A, B](fa: F[A])(f: A => B): F[B]
}
trait Apply[F[_]] extends Semigroupal[F] with Functor[F] { 
def ap[A, B](ff: F[A => B])(fa: F[A]): F[B]
}

半群曾经被称为笛卡尔,直到将笛卡尔重命名为半群#1961

请参阅这篇关于半组类别的论文。我不认为Semigroupal必须真正代表半组类别,但它的product操作也是半组类别所具有的。

同样,还有 Monoid 和 Monoidal 的语言;-al 在这里传达了相同的区别吗?

是的,它以相同的方式相关(但幺半类别似乎更广泛地使用)。

最新更新