我已经阅读了arrow notation documentation page,但我并不完全清楚“7.10.3。定义你自己的控制结构”所使用的“管道括号”是什么意思。
鉴于上述文件中的例子
proc x -> do
y <- f -< x+1
(|untilA (increment -< x+y) (within 0.5 -< x)|)
不使用箭头符号的等效代码是什么?
答案 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文档时,我只抓住了这一点。我仍觉得它相当令人费解。