0
ソースコードをmegaparsecで解析した後、私は抽象構文ツリーを持っています。第2段階では、各サブツリーに集約を計算します。それに含まれる変数のリスト、葉の値を集計して、どこかに格納したいので、後でそれらを再計算する必要はありません。私はどうしたらいいですか?ツリー集合を格納する方法
私はこれらのオプションを考えました。
- 各ノードに集計値を追加します。私は各ノードのデータ型を変更する必要があります。
- 各ノードのデータ型を汎用の集約データ型で囲みます。
- ジェネリックスノードのデータ型を集計で使用しますが、コンパイルエラーメッセージは明確ではないと思います。
- ASTと同じトポロジを持つが、集約を含む「シャドーツリー」を構築します。
何を選択すればよいですか?
サブツリーの集計値を計算してこの関数をメモする関数を作成するだけでも簡単です。これは、既存のコードに影響を与えることが少なく、再計算を避けることができます。 – mschmidt
さらに2つの選択肢があります:1)あなたのASTを修正して「Fix」https://hackage.haskell.org/package/recursion-schemes-5.0.2/docs/Data-Functor-Foldable.html#t:Fixを使って修正するアノテーション関数を 'Cofree'を使うように変更してください。 https://stackoverflow.com/questions/38462563/how-to-work-with-ast-with-cofree-annotation 2)成長していく木たちhttps://www.microsoft.com/en-us/research/ wp-content/uploads/2016/11/trees-that-grow.pdfこれは、ASTに各段階で変更できるフィールドを追加します。 – danidiaz
@danidiaz「Product」がはるかに優れた仕事をしているときに、人々が「Cofree」を使用してツリーに注釈を付けることを望んでいるような理由は理解できませんでした。 –