このタイプ(a,b,c,d)
には、 とは異なるパフォーマンス プロファイルがあり(a,(b,(c,(d,()))))
ます。一般に、n 個のタプルO(1)
take へのインデックス作成は、n 個のネストされたタプルの「hlist」へのインデックス作成ではO(n)
.
そうは言っても、 HListsに関する Oleg の古典的な作品をチェックする必要があります。HLists を使用するには、型レベルのプログラミングを広範囲に、やや大雑把に使用する必要があります。多くの人はこれを容認できないと感じており、初期の Haskell では利用できませんでした。おそらく、現在 HList を表現する最良の方法は、GADT と DataKinds を使用することです。
data HList ls where
Nil :: HList '[]
Cons :: x -> HList xs -> HList (x ': xs)
これにより、正規のネストが可能になり、この型のすべてのインスタンスに対して機能する関数を記述できます。printfzipWith
で使用されているのと同じ手法を使用して、マルチウェイを実装できます。より興味深いパズルは、このタイプに適切なレンズを生成することです (ヒント: インデックスにタイプ レベルのナチュラルとタイプ ファミリを使用します)。
私は、配列を使用する HList のようなライブラリを記述し、内部でunsafeCoerce
タプルのようなパフォーマンスを得ると同時に、汎用インターフェイスに固執することを検討しました。私はやったことはありませんが、それほど難しくはないはずです。
編集:これについて考えれば考えるほど、時間があれば一緒に何かをハックする傾向があります。Andreas Rossberg が言及している繰り返しコピーの問題は、おそらくストリーム フュージョンまたは同様の手法を使用して排除できます。