2012-01-15 43 views

回答

14

(| ... |)的括號(通常稱爲香蕉括號內)是用於施加操作上的命令,內部PROC符號的函數。它們用於從一個正常命令中消除對命令(稱爲「操作符」)進行操作的功能。二進制中綴操作符是特殊的,因此您不需要編寫(| (&&&) x y |)

至於desugaring,它們是GHC的表格關鍵字the Arrows paper的版本。

形式定義如下:

PROC p - >形式Ë C1 C2 ... CN

=

ëproc p - > c1)(PROC p - > C2)...(PROC p - > CN)

所以,proc x -> (|untilA (increment -< x+y) (within 0.5 -< x)|)將成爲:

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

如果你想desugar這完全是這樣的,沒有箭頭語法左邊,它會成爲:

untilA (arr (\x -> x+y) >>> increment) (arr (\x -> x) >>> within 0.5) 
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) 

我只抓住了這個當閱讀奧利弗查爾斯的文檔antijoins in Rel8。我仍然覺得它很彎曲。

+0

而且我認爲由操作('structure')的參數中的' - <'所捕獲的變量被強迫與'<-'在操作外部綁定的變量相關,要求將箭頭參數'structure'在它們的輸入類型中是多態的。 – 2018-02-27 11:17:09