Expressive loop combinators for Haskell