函数式语言中带底值的流处理技术详解
1. amb 运算符的并行执行问题
在处理 IM2 机器的双头流访问时,我们可以使用 amb 运算符来表达这种操作。不过,要实现这个运算符,需要为其两个参数并行执行两个线程。但并行执行是一种较为复杂的机制,实现起来并不容易。
当实现 IM2 机器的双头流访问时,我们通常使用 amb a b where a:b:x = M
这种形式的 amb 运算符。这里的 M 代表一个“生产者进程”,它对 1⊥ - 流进行双头输出访问。关键在于,amb 的两个参数的计算共享同一个可约表达式(redex)M,因此不需要并行计算它们。
如果基于图归约实现一种函数式语言,上述项可以用图 3 所示的方式表示。在这种表示中,代表两个参数的两个项图共享同一个子图作为可约表达式。所以,如果能利用这种共享结构来归约这个项,就有望在顺序计算的范围内实现 1⊥ - 流访问所需的部分 amb 运算符。
2. gamb 运算符的引入与工作原理
2.1 gamb 运算符的定义
为了实现上述目标,我们引入了 gamb 运算符,其类型为 gamb:: Bool -> Bool -> Amb Bool
。
2.2 gamb 运算符的工作示例
下面以 gtos(stog [0,0..])
的归约为例,说明 gamb 的工作原理。这里的 gtos 程序经过修改,使用 gamb 运算符代替了 amb。根据 gtos 的定义,gtos 定义中 gamb a b 的求值会产生图 4(A) 所