1

有没有像单子部分提升的东西?我需要类型签名是这样的:

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

而不是这个:

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

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

4

2 回答 2

8

那只是(return .):您需要做的就是将函数的返回值注入到 中m,这样就return完成了。通常,这只是内联编写,如return . for return $ f x, where f :: a -> r; 我从未见过它被定义。

(此外,这些天(pure .)来,它可能是更通用的类型Applicative f => (a -> r) -> a -> f r。)

于 2016-03-11T05:59:55.460 回答
3

构建此功能的另一种方法是使用Kleisli 箭头

ghci> import Control.Arrow
ghci> :t runKleisli . arr
runKleisli . arr :: Monad m => (a -> b) -> a -> m b
于 2016-03-11T08:00:05.257 回答