Kleisli 是仿函数、应用函数还是单子?

Is Kleisli a functor, applicative, or monad?

这个问题的灵感来自于我之前 question

的反馈

Scalaz 为函数 A => M[B] 提供包装器 class Kleisli[M[_], A, B]

如果 M[_] 是半群,则

Kleisli[M[_], A, B] 是半群。假设 M[_] 是一个函子。 Kleisli 也是一个函子是否正确?如果 M[_] 是应用程序或 monad 怎么办?

完全未应用的 Kleisli 没什么大不了的——它有种类 (* -> *) -> * -> * -> *,而且我不知道那种类型有任何有意义的类型 class。

如果你有一个用于类型构造函数 F[_] 的 monad,那么 Kleisli[F, ?, ?] 就是一个 Arrow(它是一个 class 类型的 class =15=]).

类似地,如果 F[_] 有一个仿函数实例,那么 Kleisli[F, A, ?] 有任何特定 A 的仿函数实例。事实上,同样的事情适用于 applicative functor 和 monad——为 F[_] 提供它们中的任何一个实例,并且为 Kleisli[F, A, ?] 也提供一个实例。

最后,如果 F[B] 有半群(或幺半群),那么 Kleisli[F, A, B] 是任何 A.

的半群(或幺半群)