タイプ(a,b,c,d)
は、(a,(b,(c,(d,()))))
とは異なるパフォーマンスプロファイルを持ちます。一般に、nタプルへのインデックス付けはO(1)
をとりますが、n個のネストされたタプルの「hlist」へのインデックス付けはO(n)
です。
これは、Olegの古典的な研究をHListsで調べる必要があります。 HListを使用するには、広範で、ややスケッチしたタイプレベルのプログラミングが必要です。多くの人々はこれを容認できず、ハスケルの初期には利用できませんでした。おそらく今日HListを表現するための最良の方法は、これは標準的なネストを与えるGADTsとDataKinds
data HList ls where
Nil :: HList '[]
Cons :: x -> HList xs -> HList (x ': xs)
であり、そしてあなたは、このタイプのすべてのインスタンスのために働く関数を記述することができます。 printfで使用されているのと同じ手法を使用して、マルチウェイzipWith
を実装することができます。もっと興味深いのは、このタイプの適切なレンズを作成することです(ヒント:インデックス作成のためにタイプレベルのナチュラルとタイプファミリーを使用する)。
私は、配列を使ったHListのようなライブラリと、一般的なインターフェイスに固執しながらパフォーマンスのようなタプルを得るためにフードの下でunsafeCoerce
を書くことを考えました。私はそれをしていないが、それは過度に困難ではありません。
編集:このことについてもっと考えてみると、私は時間があるときに何か一緒にハックすることになります。反復コピーの問題Andreas Rossbergの言及はおそらく、ストリーム融合または類似の技術を使用して排除することができます。
http://stackoverflow.com/questions/14621559/naryary-tuples-vs-pairs –