haskell-jp / beginners #21 at 2022-06-14 23:07:54 +0900

liftM2とliftA2という関数について質問です。
liftM2とliftA2の定義は以下のようになっており
liftA2 :: (a -> b -> c) -> f a -> f b -> f c
liftM2 :: Monad m => (a1 -> a2 -> r) -> m a1 -> m a2 -> m r

Applicativeに包まれているかMonadに包まれているかが違いとなる印象を受けますが、liftA2で動くがliftM2では動かない、またはliftM2では動くがliftA2では動かない簡単な具体例はありますでしょうか?(ApplicativeではあるがMonadではない例とも言える?)
ふと気になり質問させていただきました。ご回答お待ちしております。
ApplicativeはMonadが生まれた後しばらく経ってからできたものなので、 liftM2 はそうした時代に liftA2 のようなユースケースを賄うものであり、基本的に liftA2liftM2 は同じように振る舞うべき、という認識です。
liftM2' :: Monad m => (a1 -> a2 -> r) -> m a1 -> m a2 -> m r
liftM2' = liftA2

としたら`liftM2'`は`liftM2` と同じ型で同等にふるまうという理解は正しいですか?
Viktor Kronvall
@minus1216 はい、同等です。<@U4LGTMTMK> さんが仰った通り`Applicative`は`Monad`より新しくて、`ap /= (<*>)`の場合のみ結果が異なることがあります。
ご回答ありがとうございます!勉強になりました!