这个问题的灵感来自对我上一个问题的反馈
ScalazKleisli[M[_], A, B]为函数提供包装类A => M[B]。
Kleisli[M[_], A, B]是一个半群,如果M[_]是一个半群。假设这M[_]是一个函子。Kleisli也是一个仿函数是否正确?如果M[_]是 applicative 或 monad 怎么办?
完全未应用Kleisli的不是什么东西——它有 kind (* -> *) -> * -> * -> *,我不知道有任何有意义的类型类用于那种。
但是,如果您有一个类型构造函数的 monad F[_],那么它Kleisli[F, ?, ?]就是一个Arrow(它是一种类型的事物的类型类* -> * -> *)。
类似地,如果F[_]有一个仿函数实例,那么Kleisli[F, A, ?]对于任何特定的. 都有一个仿函数实例A。事实上,同样的事情也适用于应用函子和单子——拥有其中任何一个的实例,F[_]你也有一个实例Kleisli[F, A, ?]。
最后,如果你有一个 的半群(或幺半群)F[B],那么Kleisli[F, A, B]任何 的都是一个半群(或幺半群)A。