2012-01-15 16 views

cevap

14

(genellikle muz parantez adlandırılır) (| ... |) parantez proc gösterimde içinde komutlar üzerinde çalışan bir fonksiyonu uygulanması içindir. Normal bir komuttan ('operatör' olarak adlandırılır) komutlar üzerinde çalışan bir işlevi ayırmak için kullanılırlar. İkili infix operatörleri özel kasalıdır, bu yüzden (| (&&&) x y |) yazmanız gerekmez.

desugaring gelince, onlar the Arrows paper den formu anahtar kelimenin ghc versiyonu konum. aşağıdaki gibi

şekilde tanımlanır:

Proc s ->şekildee C1 C2 ... CN

=

e (proc p -> c1) (proc p -> c2) ... (proc p -> cn)

Yani, proc x -> (|untilA (increment -< x+y) (within 0.5 -< x)|) olacaktı:

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

Bunu desugar istiyorsanız tamamen hiçbir yoktur sözdizimi sol ok, bu olacaktı:

untilA (arr (\x -> x+y) >>> increment) (arr (\x -> x) >>> within 0.5) 
0

Bu çok kaba ve sezgisel cevaptır ve doğru olduğundan emin değilim ama öyle gibi geliyor. Eğer

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

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

varsa o olur yani sonra (||)block s içine kapsamında tüm <- TT-bağlı değişkenlerde beslenme bir yoludur (eşdeğer)

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) 

Sadece bu kavradı Oliver Charles'ın antijoins in Rel8 dokümanlarını okurken. Bunu hala zihin bükmeyi buluyorum.

+0

Ayrıca, işlemin argümanlarında '' <'tarafından yakalanan değişkenlerin (' yapı') işlemin dışında kalan değişkenlerle ilişkili olduğunu düşünmekteyim. 'yapı', giriş türlerinde polimorfiktir. –