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