For instance sqrt(sin(cos(theta))) can be notated Pipeline syntax implemented in functional languages expands into chained function invocation.
Everything follows from that: what we know about combining functions applies to pipes.
> When cat writes to stdout, it doesn't block waiting for grep to process that data.
That says nothing more than that nested function invocations admit non-strict evaluation strategies. E.g. the argument of a function need not be reduced to a value before it is passed to another, which can proceed with a calculation which depends on that result before obtaining it.
When you expand the actual data dependencies into a tree, it's obvious to see what can be done in parallel.