2012-01-15 21 views
10

私はarrow notation documentation pageを読んだことがありますが、 "7.10.3。独自の制御構造を定義する"で使用された "パイプブラケット"が何であるかは完全にわかりません。上記の文書の例を考えると特別な角括弧(| ... |)はどのようなものになりますか?

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

矢印表記を使用せずに同等のコードは何ですか?

答えて

14

(| ... |)ブラケット(通常はバナナブラケットと呼ばれます)は、proc表記のコマンドで動作する関数を適用するためのものです。これらは、通常のコマンドからコマンド(「オペレータ」と呼ばれる)で動作する関数の曖昧さを解消するために使用されます。バイナリインフィックス演算子は特殊ケースなので、(| (&&&) x y |)と書く必要はありません。

desugaringについては、彼らはキーワードのGHCのバージョンthe Arrows paperからです。次のように

形態に定義される:

PROC P - >形態E C1 C2 ... CN

=

Eproc p - > c1)(PROC P - > C2)...(PROC P - > CN)

ので、proc x -> (|untilA (increment -< x+y) (within 0.5 -< x)|)になるでしょう:あなたは完全にこれをdesugarしたい場合

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

これは非常にラフで直感的な答えは、私はそれが正しいのですが、それはあるようにそれは感じているかどうか分かりません。あなたが持っている場合、それは(相当)

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) 

なり、つまり

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

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

そして(||)は、私はこれだけを把握し、block秒にスコープ内のすべての<-結合型の変数に供給する方法でありますオリバー・チャールズの書類をantijoins in Rel8に読みました。私はまだそれがむしろ心を曲げていると感じます。

+0

私は、演算の引数( 'structure')で' - <'で取り込まれた変数は、演算の外側にバインドされた変数に '<-'によって強制されると考えています。 '構造体'はその入力型で多型です。 –

関連する問題