モナドの部分リフトのようなものはありますか? 型シグネチャを次のようにする必要があります。
Monad m => (a1 -> r) -> a1 -> m r
これの代わりに:
Monad m => (a1 -> r) -> m a1 -> m r
>=>
およびその他の理由で使用するため。上記を行う標準的な方法を探しています。
それだけです: あなたがする必要があるのは、関数の戻り値をに(return .)
注入することだけです。通常、これはインラインでorとして記述されます。定義されているのを見たことがありません。m
return
return . f
return $ f x
f :: a -> r
(また、最近では、(pure .)
代わりに、より一般的な type を持つ可能性がありますApplicative f => (a -> r) -> a -> f r
。)
この関数を作成するもう 1 つの方法は、クライスリの矢印を使用することです。
ghci> import Control.Arrow
ghci> :t runKleisli . arr
runKleisli . arr :: Monad m => (a -> b) -> a -> m b