在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