为什么kleisli组合物期望纯价值?

这是kleisli合成的常见实现:

kleisli :: Monad m => (a -> m b) -> (b -> m c) -> a -> m c
kleisli = \f g x -> f x >>= g

为什么它不期望单子语系中的值呢?我敢肯定有充分的理由。我只是没有设法看到它。

kleisli' :: Monad m => (a -> m b) -> (b -> m c) -> m a -> m c
kleisli' = \f g x -> x >>= f >>= g

The type seems better composable and return can be used in case we have only a pure value on the call site.

评论