Obviously you are modelling the datatype

-- data Expr = Add Expr Expr | Sub Expr Expr | Mul Expr Expr | Div Expr Expr | Num Int

You already have ExprF, and now you need to throw in Fix

newtype Fix f = In (f(Fix f))

in order to be able to build Expr like terms.

type Expr' = Fix ExprF

add a b = In (Add a b)
sub a b = In (Sub a b)
....

I've heard people refer to this technique of modelling datatypes as taking the initial algebra of the associated endofunctor (in this case ExprF) [http://strictlypositive.org/indexed-containers.pdf]

This pattern is discussed in depth in Jeremy Gibbons work. I really recommend his "Datatype-Generic Programming" piece [http://www.comlab.ox.ac.uk/jeremy.gibbons/publications/dgp.pdf ]. Someone else mentioned the multirec library. If you feel really adventurous you can look at the paper behind: "Generic programming with fixed points for mutually recursive datatypes" [http://people.cs.uu.nl/andres/Rec/MutualRec.pdf] or check out Andres presentation at ICFP [http://vimeo.com/6612724 ].

Just my 2c.

On 22/10/2009, at 09:47, Martijn van Steenbergen wrote:

Bonjour café,

data ExprF r
 =  Add  r  r
 |  Sub  r  r
 |  Mul  r  r
 |  Div  r  r
 |  Num  Int

This is a well-known pattern that for example allows nice notation of morphisms. But what is it called? I've heard fixed-point view, open datatypes and some others, but I'm curious where this pattern comes up in literature and what it is called there.

Thanks,

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

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

Reply via email to