这个问题的灵感来自我之前question
的反馈 Scalaz
为函数Kleisli[M[_], A, B]
提供了包装类A => M[B]
。
Kleisli[M[_], A, B]
是半群,则 M[_]
是半群。假设M[_]
是一个仿函数。 Kleisli
是一个仿函数也是正确的吗?如果M[_]
是申请人或单身人士怎么办?
答案 0 :(得分:7)
完全未应用的Kleisli
并不重要 - 它有类(* -> *) -> * -> * -> *
,而且我不知道任何有意义的类型类。
如果您有类型构造函数F[_]
的monad,那么Kleisli[F, ?, ?]
是Arrow
(类型类* -> * -> *
的类型类)。
同样,如果F[_]
有一个仿函数实例,那么Kleisli[F, A, ?]
就会为任何特定的A
提供一个仿函数实例。实际上,同样的东西适用于applicative functors和monad - 有F[_]
的任何一个实例,你也有Kleisli[F, A, ?]
的实例。
最后,如果你有F[B]
的半群(或幺半群),那么Kleisli[F, A, B]
是任何A
的半群(或幺半群)。