2013-04-18 15 views
6

ハスケルの汎用Trieの実装が必要でしたが、何も見つかりませんでした。Generic Trie Haskellの実装

私はmy own functionsを実装しました(ここではキーのみ、Trieではデータは必要ありませんでした)。私はHaskellでTrieを実装しています(私は新人のhaskellerです)。

Data.Trieが見つかりましたが、キーはByteStringです。

Data.Trieは正しいオプションですか? (そして、私はそれを使用する方法を知らない)

ありがとう!!! :D要求によってコメントから移動

+2

任意のキータイプで動作するトライを書く方法はありません。どのキーを使用しますか? 'Data.IntMap'と' Data.IntSet'は 'Int'キーで試行されることに注意してください。 –

+0

C.A. McCann、Trieは、シーケンスされたソースデータに対してEquality演算子をサポートする型だけが必要です。これで、あなたはTrieを構築することができます。基本的なタイプがわからない場合はどうなりますか?私の実装はTrieではありませんか?ありがとうございました! (ただし、キータイプは[a]とします) – josejuan

+2

右のように、ある種のシーケンスか、シーケンスに変換できるものが必要です。例えば、 'Data.IntMap'は' Int'を一連のビットとして扱います。各チャンクで直接並べ替えたりインデックスを付けることができればいいですが、同等かどうかを比較することのできるリストがあれば十分です。とにかく、そこに[パッケージの 'list-tries'(http://hackage.haskell.org/package/list-tries)]がありますが、それはちょっと混乱しています。 –

答えて

4

...私は私の頭の上からの知って

ザ・ごく一般的なトライの実装はthe list-tries packageです。それはいつも私を打ち負かすように打ち負かされましたが、ある人の「過度の複雑さ」は別の人の「フル機能のもの」です。また、パッケージは積極的に維持されているようですが、これは良いことです。

ああ、このパッケージは明示的にどこにでも書かれているわけではありません。「Patricia trie」バージョンは、単一分岐ノードのシーケンスを共通鍵プレフィックスを格納する単一ノードに圧縮するトライです。だから、鍵 "aabb"と "aabc"に対しては、 "aab"を持つノードを取得し、次に "b"と "c"を分岐させます。標準トライは常に一度に1つの要素を分岐します。

7

MemoTrieパッケージon Hackageon GitHubを確認してください。 単純な背景については、&の美しい基礎理論については、Haskell wiki page on memoizationを参照してください。これには、ラルフ・ヒンゼの論文が1つ、私のものはsome blog postsです。

もう1つのトライ/メモ化パッケージはファンクタコンボで、on Hackageon GitHubです。 このパッケージには、Elegant memoization with higher-order typesと他のブログ投稿に記載されているアイデアの実装が組み込まれています。

いくつかの他の関連するパッケージ:

+0

Conalありがとうございますが、私の質問にあなたの応答をマッピングすることはできません(私のせい、私は確信しています)。直感的に私はどのように私がメモの構造を調べることができるのか理解できません。一方、トライを使って、その構造を調べて新しい情報を生成することができます(メモ帳はブラックボックスとして実行されます)。私はあなたの投稿を自由に読むが、私には(マジックのように)あまりにも難しいです。D:Dとにかくありがとう!!!! – josejuan

+2

@josejuan:「メモ化構造」*はトライです。 Memoizationは、2つの段階の構成です: 'memo = untrie。トライ。第1フェーズ(「トライ」)は関数をトライに変換し、第2フェーズはそのトライを関数に変換します。あなたが望むものがメモだけであれば、 'memo'をブラックボックスとして扱うことができます。より多くのデータを検査して変換したい場合は、 'trie'の後と' untrie'の前に中断してください。これらのトライ構造は常に 'Functor'、' Applicative'、 'Foldable'、' Traversable'、 'Monad'の中にありますので、すぐに使える機能がたくさんあります。 – Conal

3

http://hackage.haskell.org/package/TrieMapは戻って一日の私の仕事の一部でした。 は "generic"で意味しますが、TrieMapは多かれ少なかれ任意の(再帰的、偶数!)代数データ型をサポートしています。バイナリツリー、トライキーとして。

+0

非常に興味深い、ありがとう! list-triesは直接使用することができ、 "generic trie"は他の構造体から使用できます(例えば、ツリーがトラバース/シーケンシング可能な場合はlist-triesで使用でき、別のものではIntTrieをリストに変換できます-trie [Bit])、あなたの実装は明示的にそれを行います! (私はあなたのパッケージを見ましたが、私は気づいていませんでした)、私は将来、確かに使用します! :Dありがとう! – josejuan