Haskell 找不到与liftM2类似的函数
在liftm2f中返回b,而在myLiftM2中返回mb;dr:使用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
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