Во что помещаются специальные скобки (| ... |)? - PullRequest
10 голосов
/ 15 января 2012

Я прочитал страницу документации для обозначения стрелок , но мне не совсем понятно, для чего используются «квадратные скобки», используемые в «7.10.3. Определение ваших собственных структур управления».*

Учитывая пример в приведенном выше документе

proc x -> do
    y <- f -< x+1
    (|untilA (increment -< x+y) (within 0.5 -< x)|)

Что такое эквивалентный код без использования стрелки?

Ответы [ 2 ]

14 голосов
/ 15 января 2012

Скобки (| ... |) (обычно называемые банановыми скобками) предназначены для применения функции, работающей с командами, внутри обозначения proc . Они используются для устранения неоднозначности функции, которая работает с командами (называемыми «оператором») из обычной команды. Бинарные инфиксные операторы имеют специальный регистр, поэтому вам не нужно писать (| (&&&) x y |).

Что касается десагеринга, то это версия GHC ключевого слова form из бумаги Стрелок .

форма определяется следующим образом:

proc p -> форма e c1 c2 ... cn

=

e ( proc p -> c1) ( proc p -> c2) ... ( proc p -> сп)

Итак, proc x -> (|untilA (increment -< x+y) (within 0.5 -< x)|) станет:

untilA (proc x -> increment -< x+y) (proc x -> within 0.5 -< x)

Если вы захотите полностью отменить это, чтобы не осталось синтаксиса стрелок, он станет:

untilA (arr (\x -> x+y) >>> increment) (arr (\x -> x) >>> within 0.5)
0 голосов
/ 25 февраля 2018

Это очень грубый и интуитивно понятный ответ, и я не уверен, что он правильный, но кажется, что так оно и есть. Если у вас есть

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 . Я все еще нахожу это довольно сногсшибательным.

...