1

モナドの部分リフトのようなものはありますか? 型シグネチャを次のようにする必要があります。

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

これの代わりに:

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

>=>およびその他の理由で使用するため。上記を行う標準的な方法を探しています。

4

2 に答える 2

8

それだけです: あなたがする必要があるのは、関数の戻り値をに(return .)注入することだけです。通常、これはインラインでorとして記述されます。定義されているのを見たことがありません。mreturnreturn . freturn $ f xf :: a -> r

(また、最近では、(pure .)代わりに、より一般的な type を持つ可能性がありますApplicative f => (a -> r) -> a -> f r。)

于 2016-03-11T05:59:55.460 に答える
3

この関数を作成するもう 1 つの方法は、クライスリの矢印を使用することです。

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