这个问题的灵感来自对我上一个问题的反馈
Scalaz
Kleisli[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
。