2011年2月存档

派生列表扫描

我一直在玩“前缀和”或更一般的“左扫描”的高效并行命令式实现。下面的帖子将探讨并行和命令派生,但作为一个热身,我将在这里处理函数和顺序的情况。

折叠

您可能熟悉左右“fold”的高阶函数。目前的文件表明:

折叠应用于二进制运算符、起始值(通常为运算符的左标识)和列表,使用二进制运算符从左到右缩小列表:

折叠fz[x1,x2,θ,xn]≡(θ((z`(f)`x1)`(f)`x2)`(f)`⋯)`(f)`x个

列表必须是有限的。

文件夹应用于二进制运算符、起始值(通常为运算符的右标识)和列表,使用二进制运算符从右到左缩小列表:

文件夹f z[x1,x2,S,xn]选择x1`(f)`(x2个`(f)`月(xn`如果`z) 年月日)

以下是典型的定义:

折叠 (b→a→b)→b→[a]→b
折叠f z[]=z(z)
折叠f z(x:X轴)= 折叠f(z`如果`x) x轴

文件夹 (a→b→b)→b→[a]→b
文件夹f z[]=z(z)
文件夹f z(x:X轴)=x个`(f)` 文件夹f z x轴

请注意折叠一步一步地建立结果,并最终一次揭示所有结果。在遍历整个输入列表之前,将锁定整个结果值。与此相反,文件夹立即开始显示信息,因此适用于无限列表。喜欢折叠文件夹也只生成最终值。

有时,也可以方便地完成所有中间步骤。这样做可以让我们超越褶皱之地,进入扫描王国。

扫描

这个扫描扫描函数对应于折叠文件夹但是生产全部的中间积累,而不仅仅是最后一次。

扫描 Ş(b→a→b)→b→[a]→[b]

扫描fz[x1,x2,θ]≡[z,z`(f)`x1,(z`(f)`x1)`(f)`x2,约]

扫描 (a→b→b)→b→[a]→[b]

扫描仪f z[E,xn_1,xn]≡[……,xn_1`(f)`(xn`(f)`z) ,xn个`(f)`z、 z)

正如您所料,最后一个值是完整的左折第一扫描中的值为完整值正确的折叠:

最后的(扫描f z xs)≡折叠f z x轴
(扫描f z xs)≡文件夹f z x轴

也就是说

最后的扫描f z≡折叠频率z
扫描f z≡文件夹频率z

标准扫描定义比折叠定义更为复杂:

扫描 (b→a→b)→b→[a]→[b]
扫描f z ls(频率z ls)=z(z):(案例最小二乘法属于
[] → []
x个:xs→扫描f(z`(f)`x) x轴)

扫描仪 (a→b→b)→b→[a]→[b]
扫描_z[]=【z】
扫描f z(x:X轴)=(x)`(f)`q):qs(质量)
哪里qs(质量)@(q):_)= 扫描f z x轴

每次我遇到这些定义时,我都必须再次浏览一遍,看看发生了什么浮现从更简单的规范。换句话说,如何得到这些定义是从简单但效率较低的定义中系统地得出的。

很可能,这些推导以前就已经做过了,但我从中学到了一些东西,我希望你们也能这样做。

继续阅读“衍生列表扫描”»

从尝试到树

本文是围绕静态大小类型和备忘录 尝试我们已经看到,长度型向量构成了有界数的trie,并且可以方便地表示数字。我们也看到了n个-维向量本身有一个优雅的trie,即n个-元素类型的trie函子的元组合:

类型 VTrie公司不适用= 尝试:^n个

对于任何函子(f)和自然数类型n个

(f):^n个f∘和f--(n次)

本系列的最后一篇文章介绍了n个-将ary函子组合到一个熟悉且有用的上下文中,即树。同样,输入编码的皮亚诺数字是中心。正如BNat公司使用这些数字类型(静态)绑定自然数(例如,对于向量索引或数字),以及Vec公司使用数字类型捕获矢量长度,接下来我们将使用数字类型捕获树深度

编辑:

  • 2011年2月2日:塞巴斯蒂安·菲舍尔(Sebastian Fischer)的评论带来的变化
    • 添加了关于数字表示和前导零的注释(没有大小类型)。
    • 添加了指向的指针通过非记忆化记忆多态函数用于推导树d a≅[d]→a
    • 为某些人固定签名分行变量,带类型参数变成棕黄色。
    • 关于数量的澄清VecTree公司左对右折叠树备注中的vs配对构造函数。
  • 2011-02-06:固定链接从快速指数到平方矩阵

继续阅读“从尝试到树”»