2011年2月22日下午12:42
我一直在玩“前缀和”或更一般的“左扫描”的高效并行命令式实现。下面的帖子将探讨并行和命令派生,但作为一个热身,我将在这里处理函数和顺序的情况。
折叠
您可能熟悉左右“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轴
每次我遇到这些定义时,我都必须再次浏览一遍,看看发生了什么浮现从更简单的规范。换句话说,如何得到这些定义是从简单但效率较低的定义中系统地得出的。
很可能,这些推导以前就已经做过了,但我从中学到了一些东西,我希望你们也能这样做。
继续阅读“衍生列表扫描”»
我一直在研究“前缀和”或更普遍的“左扫描”的高效并行、命令式实现。以下帖子将探讨并行和命令式派生,但作为热身,。。。
2011年2月1日上午10:36
本文是围绕静态大小类型和备忘录 尝试我们已经看到,长度型向量构成了有界数的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:固定链接从快速指数到平方矩阵。
继续阅读“从尝试到树”»
这篇文章是六个相关数字、向量和树系列的最后一篇,围绕着静态大小键入和备忘录尝试的主题。我们已经看到了长度型向量。。。