Это очень грубый и интуитивно понятный ответ, и я не уверен, что он правильный, но кажется, что так оно и есть. Если у вас есть
proc a -> do
a1 <- command1 <- ...
...
an <- commandn <- ...
(| structure (block1 -< expression1[a, a1, ..., an])
...
(blockm -< expressionm[a, a1, ..., an])
|)
затем (|
|)
- это способ ввода всех <-
связанных переменных в области действия в block
s, то есть он становится (эквивалентен)
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)
Я понял это только при чтении документов Оливера Чарльза для антисоединений в Rel8 . Я все еще нахожу это довольно сногсшибательным.