2006-06-09 [長年日記]
λ. 中間リストの除去とRULESプラグマ
<URL:http://haskell.g.hatena.ne.jp/nobsun/20060609>
「map f $ zip xs ys」を「zipWith (uncurry f) xs ys」に書き換えたくなるという話。実はGHCだと、前者のコードでもRULESプラグマによって最終的には「foldr2 (\x y r -> f (x,y) : r) [] xs ys」のようなコードに変換されるので、いちいち手で書き換える必要はない。
GHCではリストに関する有用な書き換え規則がRULESプラグマとして大量に定義されている。ただ、最適化のためにRULESプラグマを大量に用いるというのはやはりアドホックだと私は思うし、こういうことが出来るのはリストが標準のライブラリで、かつ非常によく使われるデータ構造だからだろう。これらの規則と同等の規則を自分で作ったデータ型に対して定義するのは非常に大変で、しかもGHCの最適化のフェーズについて理解している必要がある。
λ. outer product と cross product
<URL:http://d.hatena.ne.jp/w_o/20060607#p3> へのコメントとして、「内積や外積は inner product や outer product の直訳ではないかと」と書いたが、outer product と corss product、そして innter product と dot product は厳密には等しくないという話がある。後で読む。