想象一下一种函数式编程语言,其唯一的数据类型是数字标量和数组的任意嵌套。该语言缺乏任何无限迭代的方式,因此不允许以下内容:
- 显式循环(无论如何,没有副作用的使用很少)
- 递归
- 任意一等函数(无y组合器)
但是,该语言具有:
- 顶级功能
- 词法范围的let绑定
- 分支控制流程
- 常见的标量数学和逻辑函数
- 一些简单的数组构造函数,例如fill(n,x),它创建一个具有x相同值的n元素数组
- 最重要的是:执行并行结构化迭代(例如映射,归约,扫描,所有对)的一组受限的高阶运算符。
更具体地讲数据并行运算符:
- y = map(f,x)=> y [i] = f [i]
- y = reduce(f,a,x)=> y = f(a,f(y [p [0]],f(y [p [1 []],...))))
- y = scan(f,a,x)=> y [i] = reduce(f,a,y [0 ... i-1])
- y = allpairs(f,x,y)=> y [i,j] = f(x [i],y [j])
我们也可以有其他运算符,但是要使它们具有多项式运行时间,可以在某种合理的数据并行计算模型下实现,并且可以在大多数多项式空间使用。
显然,有些构造无法用这种语言表达,例如:
while f(x) > tol:
x <- update(x)
我们可以在这个系统中表达什么?我们是否仅限于FP中的搜索问题?我们可以捕获所有多项式时间算法吗?此外,此类是否有一些最小的运算符集?