나는이 간단한 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]
이제 추가 데이터를 추가하고 싶습니다. 그래서 나는 Expr
addLineNumbers :: Expr -> Expr2
addLineNumbers = cata $ \case
[email protected](Const _) -> 1 :< e
e -> 2 :< e
Expr2
에하지만 또한 Expr2
-String
convertToString2 :: Expr2 -> String
convertToString2 = cata $ \case
[email protected](_ :< (Const x)) -> show x
[email protected](_ :< (Add x y)) -> unwords [x, "+", y]
를 변환하는 방법을 알아낼 수 없습니다, Cofree입니다 내가 변환 할 수 있습니다 Cofree
type LineNumber = Int
type Expr2 = Cofree ExprF LineNumber
를 사용하는 것을 시도하고있다 이 주석 문제를 해결하는 가장 좋은 방법은 무엇입니까?
흥미로운 질문 :
ExprF
에 대한 대수 ...감안할 때 ... 당신은
Expr
또는AnnExpr
중 하나를 해체하는 데 사용할 수 있습니다. 나는 지금 당장 당신에게 답이 없지만이 생각을 나눌 것입니다. 'Free'는 귀납적이고'Cofree'는 유도 성입니다. 즉, 임의의 함수에 대해 (전체) 대수를 사용하는 (모범적 인) 자유 모나 딩을 보장하는 것은 종결을 보장하며, 석기질을 사용하는 동족 공동 성립은 생산적으로 보장됩니다. 다른 방법으로는 사실이 아님 –