[Haskell-cafe] What's this pattern called?
Jose Iborra
pepeiborra at gmail.com
Thu Oct 22 09:04:41 EDT 2009
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 at haskell.org
> http://www.haskell.org/mailman/listinfo/haskell-cafe
More information about the Haskell-Cafe
mailing list