有没有像单子部分提升的东西?我需要类型签名是这样的:
Monad m => (a1 -> r) -> a1 -> m r
而不是这个:
Monad m => (a1 -> r) -> m a1 -> m r
用于>=>
和其他原因。我正在寻找执行上述操作的规范方法。
那只是(return .)
:您需要做的就是将函数的返回值注入到 中m
,这样就return
完成了。通常,这只是内联编写,如return . f
or return $ f x
, where f :: a -> r
; 我从未见过它被定义。
(此外,这些天(pure .)
来,它可能是更通用的类型Applicative f => (a -> r) -> a -> f r
。)
构建此功能的另一种方法是使用Kleisli 箭头:
ghci> import Control.Arrow
ghci> :t runKleisli . arr
runKleisli . arr :: Monad m => (a -> b) -> a -> m b