>>530 の抽象の壁を設けない方法 [1] と設けた方法 [2]、
>>550 の取得系関数をタプルで一度に得るようにする方法 [3]、
併せて3つの方法で処理速度を測ってみた。
意外な結果が出て戸惑っている。

[実験方法]
ランダムな値の2次元ベクトルを 500000 個作ってリストにする。
そのリストに対して foldl1' add で総和を計算して結果を表示する {*}。
この処理 {*} の前後に Data.Time.Clock.getCurrentTime を置いて時間の差を測る。
同じ実験を3回行って平均を出す。
GHC 6.10.4 で -O2 オプションのみを付けてコンパイルした。

また、[1] や [3] にも取得関数 newVec2 を3者同じ形で作り、
それぞれの add 関数の右辺で使った。
つまり、それぞれの add 関数において、newVec2 に渡す2つの引数の
作り方による処理時間の差だけを計った(つもり)。

[結果]
[1] : 17.3s
[2] : 10.2s
[3] : 10.2s

処理速度だけなら抽象の壁を設けない [1] が最も速いだろうと思っていたが、
意外にも他の2つより1.5倍以上遅かった。
[1] において newtype Vec2 a = Vec2 (a, a) ではなく type Vec2 a = (a, a) のように
データ構築子を作らずにやっても同じ 17 秒だった。

どうしてこうなるのか、今のところ推論できずにいる。
CソースやCore言語なるものを出力して調べるしかないんだろうか。