在我学习箭头的过程中,我偶然发现了一个随着时间流逝而变得越来越清晰的点:
从约翰休斯的论文“将单子概括为箭头”中,我注意到下面(案例一)是不可能的,因为
箭头
f
in参数不能在arrow过程的本地范围内使用。
-- case I
proc (f,x) -> returnA <- f -< x --- here the f is illegal
如果我们还有一支箭,
otherArrow
,在其他地方定义,我们可以:
-- case II
proc (f,x) -> returnA <- otherArrow -< x
我明白
-<
好像没有应用箭头来应用
x
它的输入。所以我们用
-&中尉;
为了达到这个目的(案例二)。
但我不明白为什么不能使用参数中给出的箭头
proc
块。(
f型
在里面
proc (f,x)
在案例一中)。
我的不理解与一个常用的术语相冲突:
箭头命令
. 论文坚持认为它不等同于haskell表达式,haskell类型系统不适合将arrow命令作为语言的第一类。
同样,我不明白是什么事实/属性使得它不可能成为Haskell类型系统中的第一类。理解这种不可能背后的原因似乎是我需要的洞察力。
根据Ross Paterson论文中的语法:
exp ::= ...
| proc pat -> cmd
cmd ::= exp -< exp
| form exp cmd1 ... cmdn
| cmd1 op cmd2
| K pat -> cmd
| (cmd)
从这个语法我不明白不可能的原因。
但根据翻译规则我们有:
proc p -> e1 -< e2 = arr $ \p -> e2 >>> e1 -- if intersect Vars(p) and Vars (e1) is empty
= arr $ \p -> (e1,e2) >>> app -- otherwise
在第一个分支中,我们看到
p
在
e1
应该是空的。。。这种可变范围限制是arrow命令的主要特点吗?我是说,在Haskell中,arrow命令不可能成为一流命令的原因是什么?
正如我所要求的,我的思想在
箭头命令
以及
箭的组成
(使用类似于>>,最终生成箭头本身的运算符)和一个简单的
箭头
.