Haskell programmers have access to so-called arrow notation for programming with arrows (i.e. generalised functions). It looks something like this: {-# LANGUAGE Arrows #-} f :: (Int, Int, Int) -> (Int, Int, Int, Int) f = proc (a,b,c) -> do d <- (+1) -< a e <- uncurry div -< (d,c) f <- negate -< e g <- (*2) -< b returnA -< (d,e,f,g) To me this is not very satisfying. It doesn’t seem to convey the a