我正在尝试理解著名的短语A monad is just a monoid in the category of endofunctors,并将一些范畴理论概念映射到cats库中。在cats中有一个MonoidK类型类,它在combineK方法中是多态的。因此,如果我们用functor参数化它,那么这个类型类的一个实例看起来就像是endofuctors类别中的monoid。如果我们假设我们只能通过函数式将MonoidK参数化,那么从范畴论的角度来看,MonoidK和Monad有什么不同呢?
在cats中有两个半群类型类:Semigroup和SemigroupK,后者处理类型构造函数。我看不出后者比前者有什么好处。如果我查看列表实例,它们提供的是Monoid (尽管有一个MonoidK),而NonEmptyList提供的是一个SemigroupK。因此,给定一个类型的T[_],如果同时拥有一个SemigroupK[T]和一个Semigroup[T[A]] for some A,您会得到什么好处?编辑
现在有一个问题需要删除MonoidK和SemigroupK:
在阅读类型类时,我看到函子、应用函子和单子之间的关系是严格增加幂的关系。函子是可以映射的类型。应用函子可以做同样的事情,具有一定的效果。单元化与可能的非限制性效果相同。此外:Every Applicative Functor is a FunctorclassFunctor f => Applicative f where (<*>) ::