2011-11-14 16 views
21

厳密なデータ構造を実装するライブラリはありますか?具体的には、私は厳格なリストと厳密なセットを探しています。Haskellの厳密なデータ構造のライブラリ

免責事項:

  1. 私はdeepseqの承知しています。これは非常に便利ですが、deepseqを使用するたびにデータ構造全体をトラバースするオーバーヘッドが追加されます(複数回でも可能です)。

  2. 私は厳格な容器状のデータ構造は それは十分に評価されますが含まれ、すべてを保証するものではないことを認識していますが、構造は 自体は、例えば厳格でなければなりません:

    data StrictList a = !a :$ !(StrictList a) | Empty 
    

    (ここで、含まれている要素はWHNF内にあり、完全に評価されていない可能性がありますが、リストの構造は無限の値です)。

  3. 私はハッキングの 'strict'パッケージについて知っていますが、それは非常に limiteを持っています厳密なデータ構造のセット。厳密な リストもセットも含まれていません。厳格なリストを書く

  4. 自身が驚くほど簡単なようだ(私はところで、関数子、Traversableのと折り畳み式を導出するGHCの 拡張を愛しています。)が、それはより良い別のライブラリで行われますようにそれは まだいるようです。そして セットの効率的な実装は私にとってはそれほど簡単ではないようです。

+0

なぜ厳格な構造が必要ですか? – fuz

+1

@ FUZxxl物事が遅れずに評価されるようにして、スペースの使用を減らし、計算をもっと速くすることができます。逆効果もあるので、遅延構造も重要です。効率的なコードのためには、両方が必要です(どこで使用するかを知っておく必要があります)。 –

+0

@FUZxxl:SetからState Monadのようなことをしていましたが、セットから要素を挿入したり削除したりすることは頻繁にありましたが、しばらくはSetを評価しませんでした。この結果、スペースリークが発生しました。スペースリークは、spine-strict(John Lのおかげで)データ構造で修正される可能性がありました。 – shahn

答えて

13

(GHCに同梱)containersパッケージには、すぐに(私は彼らがGHC-7.4に含まれますわからないんだけど、ご希望に理由があります)、厳格な設定や地図バリアントを持っています。そのため、厳密なセットとマップを効率的に実装しています。厳密なリストは、あなたが簡単に言うように、それらを提供するハッキングのパッケージはいいと思うので、誰もがそれを自分でやる必要はありません。他に何か要りますか?

+0

いいですね。リストとセットは私が必要とするものです(今のところ)。 – shahn

7

2番目の点として、私が最もよく見てきた言葉は背骨厳格です。

スパイン厳密リストの場合、Data.Seq.Sequence(コンテナ)またはData.Vectorvector)をおそらく使用できます。どちらもリストではありませんが、あなたがやっていることに応じて、どちらか(または両方)がより良くなる可能性があります。シーケンスはO(1)consとsnocを提供し、構造の両端に非常に高速にアクセスできます。 Vectorのパフォーマンスは配列に似ています。より多くのリストのようなインターフェイスをSequenceにしたい場合は、ListLikeパッケージ(Vector用のListLikeインターフェイスもありますが、Vectorはかなり包括的なインターフェイスを提供しているのであまり役に立ちません)。どちらも背骨に厳しいです。

厳密なセットについては、unordered-containersを試してみてください。厳密なマップもあります。

+0

それは良いアドバイスです。 – shahn

+1

spine-strictは、上記のStrictListの例のように、要素がWHNFに評価されることを意味しますか?だから、あなたは最初の感嘆符を削除してもそれを背骨厳格と呼ぶことができますか? – shahn

+1

@shahn:spine-strictは、コンテナの構造が完全に評価されることを意味しますが、要素はまったく評価されない可能性があります。はい、最初の感嘆符を削除することができますが、あなたの例ではまだ背骨厳格です。 –

関連する問題