I think I misunderstood you before. I thought you were talking about putting multiple statements on a line.
But Haskell can pass around code blocks as well, with or without significant whitespace.
For example, I can define a function called 'forever' to run a sequence of actions forever like so:
forever x = x >> forever x
Where 'x' is any sequence of actions. You can pronounce '>>' as "followed by". (These are monadic actions, actually, but nevermind that.)
I can invoke it like so:
myFunc = forever (do {this; that; other})
or:
myFunc = forever $ do
this
that
other
The dollar sign is a function that lets you dispense with some parentheses. Think of it like an opening paren that closes at the end of the subexpression it's in.
If the block is a function rather than a sequence of actions, Haskell uses '\' as a lambda for introducing anonymous functions.
For example, the function 'map' takes a unary function and calls it with each value from a list. Below I'll call it with an anonymous function which returns double its argument: