This is a very rough and intuitive answer and I'm not certain it's correct but it feels like it is. If you have
proc a -> do
a1 <- command1 <- ...
...
an <- commandn <- ...
(| structure (block1 -< expression1[a, a1, ..., an])
...
(blockm -< expressionm[a, a1, ..., an])
|)
then (|
|)
is a way of feeding in all the <-
-bound variables in scope into the block
s, i.e. it becomes (equivalent to)
proc a -> do
a1 <- command1 <- ...
...
an <- commandn <- ...
structure (proc (a, a1, ..., an) -> do
block1 -< expression1[a, a1, ..., an])
...
(proc (a, a1, ..., an) -> do
blockm -< expressionm[a, a1, ..., an])
-< (a, a1, ..., an)
I only grasped this when reading Oliver Charles's docs for antijoins in Rel8. I still find it rather mind-bending.