在Haskell中,有两个函数允许对项目列表执行操作,以便将其减少为单个值。 (当然有两个以上,但这些是我感兴趣的两个。)他们是foldl1
和foldr1
。如果要执行的操作是commutative(如添加),则使用这些操作并不重要。结果将是相同的。但是,如果操作是而不是可交换(例如,减法),则这两者产生非常不同的结果。例如:在J中实现Haskell foldl1的最有效方法是什么?
foldr1 (-) [1..9]
foldl1 (-) [1..9]
答案是第一个是5,第二个是-43。歼等效的foldr1
是插入副词,/
,例如
-/ 1+i.9
其为foldr1 (-) [1..9]
等效。我想在J中创建一个类似于插入副词的副词,但向左折叠而不是向右折叠。我能想出的最好的是以下几点:
foldl =: 1 : 'u~/@|.'
因此,我们可以说:
- foldl 1+i.9
,并得到-43的答案,这是从左侧倍的预期。
在J中有更好的方法吗?出于某种原因,颠倒y
的论点对我来说似乎并不高效。也许有一种方法可以做到这一点,而不必诉诸于此。
我不知道是否有除了翻转数组之外的东西,不管它看起来多么实用。人们会认为(或者希望)Haskell不会那么做,只是从最后起作用... – MPelletier 2011-03-07 16:04:09
我的意思是“不管多么实际。” – MPelletier 2011-03-07 16:16:08