绑定多个参数

时间:2014-02-06 15:40:16

标签: haskell monads

在Haskell中,有:

(>>=) :: Monad m => m a -> (a -> m b) -> m b

是否有功能:(?)

bind2 :: Monad m => m a -> m b -> (a -> b -> m c) -> m c

3 个答案:

答案 0 :(得分:13)

不完全,但你可以使用

bind2 :: Monad m => m a -> m b -> (a -> b -> m c) -> m c
bind2 x y f = join $ liftM2 f x y

答案 1 :(得分:5)

或者,只使用第一原则(>> =),像这样(在ghci中尝试)

Prelude> :set +t

Prelude> let bind2 x y f = x >>= \ a -> y >>= \ b -> f a b
bind2 :: Monad m => m a -> m a1 -> (a -> a1 -> m b) -> m b

Prelude> let bind2 x y f = do a <- x ; b <- y ; f a b
bind2 :: Monad m => m t -> m t1 -> (t -> t1 -> m b) -> m b

答案 2 :(得分:5)

这是符号的含义。

bind2 :: (Monad m) => m a -> m b -> (a -> b -> m c) -> m c
bind2 ma mb f = do
  a <- ma
  b <- mb
  f a b

这很简单,我可能甚至不会为它定义一个额外的运算符,而是直接使用do notation。