私はこの簡単なExpr
ASTを持っており、簡単にString
に変換できます。CofreeアノテーションでASTを使用するにはどうすればよいですか?
import Prelude hiding (Foldable)
import qualified Prelude
import Data.Foldable as F
import Data.Functor.Foldable
import Data.Monoid
import Control.Comonad.Cofree
data ExprF r = Const Int
| Add r r
deriving (Show, Eq, Ord, Functor, Prelude.Foldable)
type Expr = Fix ExprF
testExpr = Fix $ Add (Fix (Const 1)) (Fix (Const 2))
convertToString :: Expr -> String
convertToString = cata $ \case
[email protected](Const x) -> show x
[email protected](Add x y) -> unwords [x, "+", y]
ここで追加のデータを追加します。 だから私はCofree
type LineNumber = Int
type Expr2 = Cofree ExprF LineNumber
を使用しようとしています、私はExpr
Expr2
から
addLineNumbers :: Expr -> Expr2
addLineNumbers = cata $ \case
[email protected](Const _) -> 1 :< e
e -> 2 :< e
に変換することができます。しかし、私はExpr2
String
から
convertToString2 :: Expr2 -> String
convertToString2 = cata $ \case
[email protected](_ :< (Const x)) -> show x
[email protected](_ :< (Add x y)) -> unwords [x, "+", y]
を変換する方法を見つけ出すことはできません。また、Cofreeですこのアノテーションの問題を解決する最善の方法は?
興味深い質問:
ExprF
のための代数...を考えると...あなたは
Expr
やAnnExpr
のいずれかを取り壊すためにそれを使用することができます。私は今あなたのための答えがありませんが、私はこの考えを共有します。 'Free'は誘導的で、' Cofree'は誘導性です。つまり、任意のファンクタの(総数)代数を使ってフリーモナールを破棄することは保証され、連帯を使用する同族コモンドを構築することは生産性が保証されます。他の方法では真ではない –