Janis Voigtlaender wrote:
A free theorem can be used to prove that any

f :: (a -> b) -> [a] -> [b]

which satisfies

f id = id

also satisfies

f = map (for the Haskell standard map).

Here comes the full proof.

Feed http://linux.tcs.inf.tu-dresden.de/~voigt/ft/ with the type of f.

The output is:

For every f :: forall a b . (a -> b) -> [a] -> [b] holds:

forall t1,t2 in TYPES, g :: t1 -> t2.
 forall t3,t4 in TYPES, h :: t3 -> t4.
  forall p :: t1 -> t3.
   forall q :: t2 -> t4.
    (forall x :: t1. h (p x) = q (g x))
    ==> (forall y :: [t1]. map h (f p y) = f q (map g y))

Set p = id and g = id. It results:

forall t3,t4 in TYPES, h :: t3 -> t4.
 forall q :: t3 -> t4.
  (forall x :: t3. h (id x) = q (id x))
  ==> (forall y :: [t3]. map h (f id y) = f q (map id y))

The precondition is obviously fulfilled whenever h = q.

So we get, for every h,

forall y :: [t3]. map h (f id y) = f h (map id y)

Now note that we assume f id = id, and also know map id = id.

This gives:

forall y :: [t3]. map h y = f h y

This is the desired extensional equivalence of map and f.

All we needed was a free theorem and the identity law.

The same kind of proof works for the Tree type, and friends.

Ciao, Janis.

--
Dr. Janis Voigtlaender
http://wwwtcs.inf.tu-dresden.de/~voigt/
mailto:[EMAIL PROTECTED]

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

Reply via email to