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
.
的半群(或幺半群)
这个问题的灵感来自于我之前 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
.