1

ツリーのタイプを定義しました。

data Tree a = Empty | Node a (Tree a) (Tree a) deriving (Read , Eq, Ord, Show)

さて、テキスト ファイルにはバイナリ ツリーがあります。次に例を示します。

(7 (3 (1 () ()) (5 () ())) (11 (9 () ()) (13 () ())))

このツリーの表現を読み取り、Tree 型のツリーを構築する関数を作成するにはどうすればよいでしょうか?

4

3 に答える 3

2
于 2013-02-09T19:10:38.150 に答える
0

ヒントを教えてください:

  1. ツリーは自己相似構造です。それはあなたが使うべきだと思います...

  2. ()木を表すEmpty

  3. ツリーの表現にはこの構造があり(string_data_with_type_a string_tree string_another_tree)ます。これら 2 つの括弧は省略でき、スペースでこれら 3 つのパラメーターを区切ることができるようです。

それで全部です。よい旅を、ハスケラー。

聞けば答えられる。

于 2013-02-09T16:44:13.420 に答える
0

あなたは解析関数を書いています。基本的なタイプは のようなものですがString -> Tree Int、考慮に値する強力な改良点がいくつかあります。

まず、すべてStringの s が実際に s に変換できるわけではないTree(つまり、ツリーではない) ため、関数をの")"ような型に絞り込む方がよい。モナドは失敗の可能性を示している。String -> Maybe (Tree Int)Maybe

Int第二に、おそらくパーサーを再発明したくないでしょう。Readtypeclass を使用して、パーサーのコレクションにアクセスできます。だからあなたはかもしれません

  • タイプを再度絞り込み、次のようにしますRead a => String -> Maybe (Tree a)
  • モジュールをインポートしSafeてアクセスしますreadMay :: Read a => String -> Maybe a
  • Tree次に、解析コンポーネントをビルドします。

第三に、Trees は非常に再帰的であり、括弧内の Lispy 文法は非常に再帰的であり、パーサーも再帰的であるべきです。この目的のために、単一のノード"(...)"を解析し、必要に応じて内部ノードを再帰的に解析することに集中してください。

最後に、最終的にはさらに強力な解析ツールを検討することをお勧めします。Parsecクラスよりもはるかに強力で、Read小さくて単純な部分からより複雑で再帰的なパーサーを簡単に構築できます。

于 2013-02-09T17:02:58.417 に答える