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

在liftM2 f中返回b,但myLiftM2返回m b

最佳答案

tl; dr:请使用join :: Monad m => m (m a) -> m a,因为普通升降机将返回m (m a)。例如。写

join $ liftM2 f a b

但也...
liftM也可以用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

编辑:
正如Daniel Wagner指出的那样,您可以轻松地编写
join $ liftM2 a b c

相当于
join $ a <$> b <*> c

我对应用风格的推荐是为了提高可读性,这是一个单独的观点。

关于haskell - 找不到类似于liftM2的功能,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20163880/

10-11 01:35