我已閱讀arrow notation documentation page,但我不完全清楚「7.10.3。定義自己的控制結構」下使用的「管道支架」。特殊括號(| ... |)解析成什麼?
鑑於上述文件
proc x -> do
y <- f -< x+1
(|untilA (increment -< x+y) (within 0.5 -< x)|)
什麼,而無需使用箭頭符號的等效代碼的例子嗎?
我已閱讀arrow notation documentation page,但我不完全清楚「7.10.3。定義自己的控制結構」下使用的「管道支架」。特殊括號(| ... |)解析成什麼?
鑑於上述文件
proc x -> do
y <- f -< x+1
(|untilA (increment -< x+y) (within 0.5 -< x)|)
什麼,而無需使用箭頭符號的等效代碼的例子嗎?
(| ... |)
的括號(通常稱爲香蕉括號內)是用於施加操作上的命令,內部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)
這是一個非常粗略的和直觀的答案,我不能肯定它是正確的,但它的感覺就像是。如果你有
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。我仍然覺得它很彎曲。
而且我認爲由操作('structure')的參數中的' - <'所捕獲的變量被強迫與'<-'在操作外部綁定的變量相關,要求將箭頭參數'structure'在它們的輸入類型中是多態的。 – 2018-02-27 11:17:09