Haskell 特殊的支架(|…|)是用来做什么的?

Haskell 特殊的支架(|…|)是用来做什么的?,haskell,syntax,arrows,Haskell,Syntax,Arrows,我已经读过了,但我并不完全清楚“7.10.3.定义您自己的控制结构”中的“管道支架”使用了什么 给出了上述文档中的示例 proc x -> do y <- f -< x+1 (|untilA (increment -< x+y) (within 0.5 -< x)|) proc x->do y括号(|…|)用于在proc符号中应用对命令进行操作的函数。它们用于消除对命令(称为“运算符”)进行操作的函数与正常命令之间的歧义。二进制中缀运算符是特殊情况

我已经读过了,但我并不完全清楚“7.10.3.定义您自己的控制结构”中的“管道支架”使用了什么

给出了上述文档中的示例

proc x -> do
    y <- f -< x+1
    (|untilA (increment -< x+y) (within 0.5 -< x)|)
proc x->do
y括号(|…|)
用于在proc符号中应用对命令进行操作的函数。它们用于消除对命令(称为“运算符”)进行操作的函数与正常命令之间的歧义。二进制中缀运算符是特殊情况的,因此不需要编写
(&&&&)xy>

至于desugaring,它们是GHC版本的表单关键字

表格定义如下:

procp->表格e c1 c2。。。cn

=

e(procp->c1)(procp->c2)。。。(procp->cn)

因此,
proc 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)

这是一个非常粗略和直观的答案,我不确定它是否正确,但感觉它是正确的。如果你有

proc a -> do
    a1 <- command1 <- ...
    ...
    an <- commandn <- ...

    (| structure (block1 -< expression1[a, a1, ..., an])
                 ...
                 (blockm -< expressionm[a, a1, ..., an])
    |)

我只是在读奥利弗·查尔斯的医生时才领会到这一点。我仍然觉得这很令人费解。

而且我认为
-
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)