
ctm:
Indeed it can. Ignoring conventional wisdom about dirty linen, here are idiom brackets
class Applicative i => Idiomatic i f g | g -> f i where idiomatic :: i f -> g
iI :: Idiomatic i f g => f -> g iI = idiomatic . pure
data Ii = Ii
instance Applicative i => Idiomatic i x (Ii -> i x) where idiomatic xi Ii = xi instance Idiomatic i f g => Idiomatic i (s -> f) (i s -> g) where idiomatic sfi si = idiomatic (sfi <*> si)
So that
iI f x y Ii = f <$> x <*> y
Now add
data Ji = Ji
instance (Monad i, Applicative i) => Idiomatic i (i x) (Ji -> i x) where idiomatic xii Ji = join xii
and you've got
iI f x y Ji = join $ f <$> x <*> y
Very nice! Just so we don't forget this, I created a wiki page, http://haskell.org/haskellwiki/Idiom_brackets -- Don