找不到类似liftM2的功能

时间:2013-11-23 15:02:41

标签: haskell monads

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

1 个答案:

答案 0 :(得分:6)

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

我对应用风格的建议是为了便于阅读,并且是一个单独的观点。