1

を使用するcataを使用すると、結果にASTを折り畳むことができます。 Cofreeを使用すると、ASTに追加の注釈を保存できます。どのようにしてASTを取得し、各ステップで結果とともに注釈付きASTを返すことができますか?ハスケル再帰スキーム:中間結果でツリーにラベルを付ける

alg :: Term Result -> Result 
alg = undefined 

run :: Fix Term -> Result 
run ast = cata alg ast 

run' :: Fix Term -> Cofree Term Result 
run' = ??? 
+0

https://stackoverflow.com/questions/38462563/how-to-work-with-ast-with-cofree-annotation –

+0

(TLの可能性のある重複; DR: '製品を使用します'、' Cofree'ではなく、ラベル付けに使用します)。 –

+0

'Product'を使うと、構造体simoultaniaslyの両方でiterateしますか? – user47376

答えて

2

この変更された代数は機能しますか?

alg' :: Term (Cofree Term Result) -> Cofree Term Result 
alg' t = alg (fmap extract t) :< t 

run' :: Fix Term -> Cofree Term Result 
run' ast = cata alg' ast 

extractControl.Comonadからです。ここではタイプCofree Term Result -> Resultで使用しています。アノテーションをルートに戻すだけです。

fmap extract :: Term (Cofree Term Result) -> Term Result私たちは以前のalgの定義を再利用できます。

+0

ありがとう!しかし、もう一つの問題があります。実際に私の「結果」はモナドに包まれています。だから '実行 '::固定用語 - >無条件用語(m結果)'。 'm(Cofree Term Result)'を得るために何ができるでしょうか? – user47376

+0

@ user47376元の代数は 'alg :: Term(m Result) - > m Result'のようですか? – danidiaz

+0

はい。完全な型は 'hm ::(MonadError TypeError m、MonadState Count m)=> Term(エイリアスm) - >エイリアスm'です。 'タイプエイリアスm =環境 - > m(代入、タイプ)'。それは実際にはあらゆる種類のものに包まれています。私は 'Type'だけに興味があります。最終的な結果は 'Cofree Term Type'であるべきです – user47376

0

単純な異型性が必要な場合は、cataMのような機能を使用できます。これにより、モナドの値を折り畳むことができ、アクションが適切に順序づけられます。さらに、F代数をラップするための定型文を書く必要はありません。

その後

alg :: Term Result -> Cofree Term Result 
alg = undefined 

run' :: Fix Term -> Cofree Term Result 
run' = cataM alg