Monad 的部分提升?

Partial lift for Monads?

是否有类似 monad 的部分提升? 我需要这样的类型签名:

Monad m => (a1 -> r) -> a1 -> m r

而不是这个:

Monad m => (a1 -> r) -> m a1 -> m r

用于 >=> 和其他原因。我正在寻找执行上述操作的规范方法。

那只是 (return .):您需要做的就是将函数的 return 值注入 mreturn 完成。通常,这只是内联写入,如 return . freturn $ f x,其中 f :: a -> r;我从未见过它的定义。

(另外,现在,这可能是 (pure .),它具有更通用的类型 Applicative f => (a -> r) -> a -> f r。)

构建此函数的另一种方法是使用 Kleisli arrow:

ghci> import Control.Arrow
ghci> :t runKleisli . arr
runKleisli . arr :: Monad m => (a -> b) -> a -> m b