Monad 的部分提升?
Partial lift for Monads?
是否有类似 monad 的部分提升?
我需要这样的类型签名:
Monad m => (a1 -> r) -> a1 -> m r
而不是这个:
Monad m => (a1 -> r) -> m a1 -> m r
用于 >=>
和其他原因。我正在寻找执行上述操作的规范方法。
那只是 (return .)
:您需要做的就是将函数的 return 值注入 m
,return
完成。通常,这只是内联写入,如 return . f
或 return $ 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
是否有类似 monad 的部分提升? 我需要这样的类型签名:
Monad m => (a1 -> r) -> a1 -> m r
而不是这个:
Monad m => (a1 -> r) -> m a1 -> m r
用于 >=>
和其他原因。我正在寻找执行上述操作的规范方法。
那只是 (return .)
:您需要做的就是将函数的 return 值注入 m
,return
完成。通常,这只是内联写入,如 return . f
或 return $ 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