Re: [Haskell-cafe] Re: Cyclic data declarations

2009-08-02 Thread Michal D.
>
>   newtype StmtRec = StmtRec (Stmt [StmtRec])
>

That's pretty much were I threw in the towel last night. Except I had
a bunch of places where I had to add the extra constructor statements.
I wish there was a solution that didn't require these... they really
butcher pattern matching clarity.

> will do. More generally, you can use
>
>   newtype Fix f = In { out :: f (Fix f) }
>
> and define
>
>   type StmtRec = Fix ([] `O` Stmt)
>
> where  O  denotes composition of functors
>
>   newtype O f g a = O (f (g a))
>

Thanks for that! This provoked some thought on my part about what
exactly is going on. I think I could solve this if I added some way to
identify that a type parameter is actually referring to the whole
type. Say we had a reserved word "fixpoint" for this. Then we'd have
something like:

data Stmt x = SIf x x

then when we actually go to use it, it would be referred to as the type:

"Stmt [fixpoint]"

Which would get treated exactly like the data declaration:

data Stmt = SIf [Stmt] [Stmt]

I'll need to add the newtype declaration for the code but I'd be
interested if anyone had further thoughts on this topic. I have an
implementation of both approaches on a toy parser, but I doubt
anyone's interested in seeing that.

Michal
___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


[Haskell-cafe] Cyclic data declarations

2009-08-01 Thread Michal D.
I'm in the process of writing a toy compiler but I'm having some
trouble trying to make my datatypes general. For example, using parsec
I parse statements as:

data Stmt = SIf Test [Stmt] [Stmt]   |   ...

However, when it's time to create a control flow graph it would be
nice to represent statements as (the Int's signify the node id's for
either case of the if statement):

data Stmt = SIf Test Int Int   |   ...

So, in a eureka moment I decided that this should be allowable with
the following declaration:

data Stmt link = SIf Test link link   |   ...

Ofcourse, the problem is trying to declare the resulting type for
parsing: "parse -> Stmt [Stmt [Stmt ]]". Any hints on whether
there is a way to accomplish what I'm trying to do or do I have to
bite the bullet and declare two seperate datatypes? I tried being
clever and declaring a 'helper' type as "type StmtRec = Stmt [StmtRec]"
but to no avail... GHC won't let it slide: "Cycle in type synonym declarations"!

Cheers,

Michal
___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe