ami*_*dfv 5 haskell higher-order-functions
Data.Array不提供Array类型的折叠.
在真实世界的Haskell(第12章)中,据说Array可以根据程序员的需要以不同的方式折叠s:
首先,有几种折叠是有意义的.我们可能仍然希望折叠单个元素,但我们现在也可以折叠行或列.除此之外,对于一次折叠元素,不再只有两个遍历序列.
这不完全是真的List吗?代表例如具有多维的矩阵是非常常见的List,但仍然存在为一维Lists 定义的折叠.
我错过了什么微妙之处?是多维Array是否Array与Arrays 完全不同?
编辑:嗯,甚至多维数组都有实例形式的折叠定义Data.Foldable.[0]那么它如何适应真实世界Haskell的引用呢?
[0] http://hackage.haskell.org/packages/archive/base/4.6.0.0/doc/html/Data-Foldable.html
既然你提到之间的"多维"的区别Array和Array的ArrayS,这将很好地说明这一点,与旁边的列表进行比较.
折叠(在Foldable类意义上)是一种固有的线性操作,就像列表是固有的线性结构一样; 右侧折叠通过将其构造函数与参数一对一地匹配来完全表征列表foldr.虽然您也可以定义类似的功能foldl,但可以明确选择标准的规范折叠.
Array没有这样透明的结构,可以在折叠中一对一匹配.它是一种抽象类型,可以访问由索引值提供的各个元素,索引值可以是具有Ix实例的任何类型.因此,实现折叠不仅没有明显的选择,也没有内在的线性结构.它确实Ix允许您枚举一系列索引,但这更像是一个实现细节而不是其他任何东西.
多维Arrays怎么样?它们本身并不存在.Ix为也是实例的类型的元组定义实例,如果你想将这些元组视为"多维"的索引类型Array,请继续!但他们仍然只是元组.显然,Ix在这些元组上放置一些线性顺序,但它是什么?你能在文档中找到任何告诉你的东西吗?
所以,我认为我们可以有把握地说,Array使用定义的顺序折叠多维Ix是不明智的,除非你真的不关心你获得元素的顺序.
对于一个Array的ArrayS,另一方面,只有一个将它们组合,很像嵌套列表明智的方式:折叠每个内Array分别按照自己的元素的顺序,再根据所述外每个的结果折叠Array的的顺序元素.
现在,您可能会合理地反对,因为在一维和多维Arrays 之间没有类型区别,并且可以假设前者基于Ix实例具有合理的折叠顺序,为什么不默认使用该排序?Array毕竟,已经存在一个返回列表中元素的函数.
事实证明,图书馆本身会同意你的看法,因为这正是Foldable实例所做的.