<div dir="ltr">There originally seems like there shouldn't be one, because it's impossible to, for any permutation of the arguments of (>>=), get the covariances/contravariances right on the arguments. However, based on the fact that there is a mapping:<div><br></div><div>a -> ((a -> r) -> r)</div><div><br></div><div>and what seems like an isomorphism:</div><div><br></div><div>(a -> r) -> (((a -> r) -> r) -> r)</div><div>(((a -> r) -> r) -> r) -> (a -> r)</div><div><br></div><div>then this looks like it might be some kind of monad-like structure:</div><div><br></div><div>class Contravariant f => Contramonad f where</div><div>    contrareturn :: a -> f (f a)</div><div>    contrabind :: (a -> f (f b)) -> f b -> f a</div><div><br></div><div>I have no idea what the laws should be for it, though. So is this worth pursuing, or have I just stumbled down a blind alley?</div></div>