特殊括号(| ... |)desugar是什么?

时间:2012-01-15 11:08:07

标签: haskell syntax arrows

我已经阅读了arrow notation documentation page,但我并不完全清楚“7.10.3。定义你自己的控制结构”所使用的“管道括号”是什么意思。

鉴于上述文件中的例子

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

不使用箭头符号的等效代码是什么?

2 个答案:

答案 0 :(得分:14)

(| ... |)括号(通常称为香蕉括号)用于在 proc 表示法中应用对命令进行操作的函数。它们用于消除从正常命令操作命令(称为“操作符”)的函数的歧义。二进制中缀运算符是特殊的,因此您无需编写(| (&&&) x y |)

至于desugaring,它们是来自the Arrows paper的GHC版形式关键字。

表格的定义如下:

  

proc p - &gt; 表格 e c1 c2 ... cn

     

=

     

e proc p - &gt; c1)( proc p - &gt; c2)...( proc < / strong> p - &gt; cn)

所以,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)

答案 1 :(得分:0)

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

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)

在阅读Oliver Charles的antijoins in Rel8文档时,我只抓住了这一点。我仍觉得它相当令人费解。