Map (高階函式)

Map (高階函式)

對映的數學基礎允許很多最佳化(英語:Program optimization)。複合定律確保了如下二者:

(map f . map g) list

map (f . g) list

導致相同的結果;就是說

map

(

f

)

map

(

g

)

=

map

(

f

g

)

{\displaystyle \operatorname {map} (f)\circ \operatorname {map} (g)=\operatorname {map} (f\circ g)}

。但是第二種形式比第一種形式在計算上更加有效率,因為每個map要求從頭重建整個列表。因此,編譯器將嘗試將第一種形式變換第二種形式;這種類型的最佳化叫做「對映融合」,是迴圈融合(英語:Loop fission and fusion)的函數式類似者[4]。

對映函式可以並經常依據fold比如foldr來定義,這意味著可以做「map-fold融合」:foldr f z . map g等價於foldr (f . g) z。

在一個單鏈結串列上的map實現不是尾遞迴的,所以它在呼叫於大型列表的時候,可能在棧上建造大量的訊框。很多語言作為替代的提供「逆向map」函式,它等價於逆轉一個對映後的列表,但它是尾遞迴的。下面是利用了左fold函式的一個實現:

reverseMap f = foldl (\ys x -> f x : ys) []

因為逆轉單鏈結串列也是尾遞迴的,reverse和reverse-map可以複合起來以尾遞迴方式進行正常的map,儘管這需要在這個列表上進行兩趟。

更多创意作品