Haskell 找不到与liftM2类似的函数

Haskell 找不到与liftM2类似的函数,haskell,monads,Haskell,Monads,在liftm2f中返回b,而在myLiftM2中返回mb;dr:使用join::Monad m=>m(ma)->ma,因为普通电梯将返回m(ma)。例如写 myLiftM2 :: Monad m => (a -> a1 -> m b) -> m a -> m a1 -> m b myLiftM2 f x y = x >>= (\r1 -> y >>= (\r2 -> f r1 r2)) 但也… liftMs也可以用App

在liftm2f中返回b,而在myLiftM2中返回mb;dr:使用
join::Monad m=>m(ma)->ma
,因为普通电梯将返回
m(ma)
。例如写

myLiftM2 ::  Monad m => (a -> a1 -> m b) -> m a -> m a1 -> m b
myLiftM2 f x y = x >>= (\r1 -> y >>= (\r2 -> f r1 r2))
但也…

liftM
s也可以用
Applicative
编写,例如

作为等价物

join $ liftM2 a b c
加入$abc

我对应用程序风格的建议是为了可读性,这是一个单独的观点。

它在实践中并不经常出现,而且很容易用
liftM2
join
myLiftM2=(join.)。liftM2
.is7s,恕我不同意。我在实践中多次遇到这个函数,但我通常使用do表示法而不是使用函数。这在
Control.Monad.Parallel
中称为
bindM2
。如果要使用
join
,您可以在不偏离其他样式的情况下完成此操作:
myliftm2fxy=join$liftm2fxy
。是的——我想我建议单独使用join和applicative样式
liftM2 a b c   == a <$> b <*> c
liftM3 a b c d == a <$> b <*> c <*> d
import Control.Applicative

myLiftM2 :: (Monad m, Applicative m) => (a -> a1 -> m b) -> m a -> m a1 -> m b
myLiftM2 f x y = join $ f <$> x <*> y
join $ liftM2 a b c
join $ a <$> b <*> c