存在 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
,它结合了Semigroupal
和Functor
,如以下简化视图所示
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 在这里传达了相同的区别吗?
是的,它以相同的方式相关(但幺半类别似乎更广泛地使用)。