fixed point

Ross Paterson ross at soi.city.ac.uk
Tue Oct 28 16:05:48 EST 2003


On Tue, Oct 28, 2003 at 11:56:21AM +0100, Josef Svenningsson wrote:
> On Mon, 27 Oct 2003, Josef Svenningsson wrote:
> > This is a very nice technique. As an exercise to the reader I suggest the
> > following program:
> >
> > \being{code}
> > data Tree a = Branch a (Tree (a,a)) | Leaf
> >
> > cross f (a,b) = (f a,f b)
> >
> > main1 =
> >   let mapTree :: (a -> b) -> Tree a -> Tree b
> >       mapTree = \f tree -> case tree of
> >                             Branch a t -> Branch (f a) (mapTree (cross f) t)
> >                             Leaf -> Leaf
> >   in mapTree id (Branch 42 Leaf)
> > \end{code}
> >
> I realise I was perhaps a bit dense in my previous mail. It was not my
> intention to try to sound smart. Sorry for that.
> 
> Does anyone know how to apply the transformation suggested by Paul Hudak
> to my program and make it typecheck? Does there exist a type system where
> the transformed program typechecks? I suppose so but I don't quite know
> what it would look like.

Polymorphic recursion implies a fix with a rank 3 type.  GHC can handle
those, but each one needs its own declaration, as in

	type MapTree = forall a b. (a -> b) -> Tree a -> Tree b

	fixMT :: (MapTree -> MapTree) -> MapTree
	fixMT f = f (fixMT f)

	mapTree' = fixMT (\ (mapTree :: MapTree) -> \f tree -> case tree of
			    Branch a t -> Branch (f a) (mapTree (cross f) t)
			    Leaf -> Leaf)


More information about the Haskell-Cafe mailing list