Как работать с AST с аннотацией Cofree?

У меня есть это простоExpr АСТ, и я могу легко преобразовать его вString.

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
  e@(Const x) -> show x
  e@(Add x y) -> unwords [x, "+", y]

Теперь я хочу добавить к нему дополнительные данные. Поэтому я пытаюсь использоватьCofree

type LineNumber = Int
type Expr2 = Cofree ExprF LineNumber

Я могу конвертироватьExpr вExpr2

addLineNumbers :: Expr -> Expr2
addLineNumbers = cata $ \case
  e@(Const _) -> 1 :< e
  e -> 2 :< e

Но я не могу понять, как конвертироватьExpr2 вString

convertToString2 :: Expr2 -> String
convertToString2 = cata $ \case
  e@(_ :< (Const x)) -> show x
  e@(_ :< (Add x y)) -> unwords [x, "+", y]

Кроме того, является ли Cofree лучшим способом решения этой проблемы с аннотациями?

Ответы на вопрос(1)

Ваш ответ на вопрос