[Haskell-cafe] Re: Cyclic Type-synonyms
Christophe Poucet
christophe.poucet at gmail.com
Wed Jul 5 12:28:29 EDT 2006
Addendum:
(18:19:50) *vincenz:* anyways the haskell-cafe post is orthogonal to this
safety issue
(18:20:46) *vincenz:* it's about the inability to use a generic annotation
data-type with any generic indirect composite ADT without introducing a
third data constructor if one wants recursion
(18:21:33) *vincenz:* data Foo a = A a; date Note a n = Note { data :: a,
info :: n} ; type RecNoteFoo = Note (Foo RecNoteFoo) Int**
(18:25:53) *audreyt:* vincenz: that is a good summary.
(18:26:17) *audreyt:* sugar selectors, smart constructors, SYB, etc.
(18:26:24) *audreyt:* but the core problem seems like a real limitation
On 7/5/06, Christophe Poucet <christophe.poucet at gmail.com> wrote:
>
> Hello,
>
> I use the Indirect Composite pattern a lot, and this means that typically,
> especially with recursive types (such as an AST), you end up with a lot of
> data-constructors. I understand that it is not possible to have pure cyclic
> types (because haskell requires iso-recursive and not equi-recursive
> types). However I wonder why certain cases can not be allowed.
>
> For instance, assume the following somewhat simplified AST:
>
> data Exp e =
> ELet String e e -- let x = a in b
> | ECond e e e -- If then else construct
>
> Now if I wanted to decorate this structure, I would use something like:
>
> data AnnotExp a = AE {
> unAE :: Exp (AnnotExp a),
> note :: a
> }
>
> However, and this example might be slightly too trivial to motivate it,
> however it does exemplify what can be done, one might not want to annotate
> at all and just have a recursive data AST. At this point, one either uses
> AnnotExp () or creates a new data type. It would be nice if instead one
> could use cyclic type-declarations, with the knowledge that we're going
> through a data-constructor and hence the type iso-recursive and not
> equi-recursive:
>
> type AST = Exp AST -- This is iso-recursive as it goes through the data
> constructors ELet and ECond
>
> Sadly this is not possible with the current GHC (I'm using 6..4.2). Is
> this possible with 6.6? Is there any reason why this is not possible.
> Feedback regarding this is welcome. A more motivating example can be seen
> below.
>
> Cheers,
> Christophe
>
> -----------------------------
> data Exp var ident func exp stm =
> ELit Lit -- ^ Literals
> | EVar ident -- ^ Identifiers
> | EData Const [exp] -- ^ Data Constructors
> | ECall func -- ^ Function Calls
> | ELet var stm stm -- ^ Scoping
> | ECond exp stm stm -- ^ Conditional
> | ELoop exp stm -- ^ Looping
> deriving (Eq, Show)
>
> data AExp exp annot = AExp {
> unAExp :: exp,
> aexpNote :: annot,
> aexpLoc :: Location
> }
>
> type UnCorExp var annot =
> Exp
> var -- ^ Let-binders
> var -- ^ Named identifiers
> (Ident, [AExp UnCorExp var annot]) -- ^ Function calls
> (AExp UnCorExp var annot) -- ^ Expressions
> (AExp UnCorExp var annot) -- ^ Statements
>
> -- Flattened AST: function parameters can only be variables, similar for
> while- and if- conditions
> type UnSimExp var annot
> Exp
> var -- ^ Let-binders
> var -- ^ Named identifiers
> (Ident, [var]) -- ^ Function calls
> (var) -- ^ Expressions
> (AExp UnSimExp var annot) -- ^ Statements
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.haskell.org//pipermail/haskell-cafe/attachments/20060705/ba4483af/attachment.htm
More information about the Haskell-Cafe
mailing list