Robin Green wrote:

I am proving various statements relating to applicative functors, using
the Coq proof assistant (I am considering only Coq terms, which always
terminate so you don't have to worry about _|_). However, I'm not sure
how to go about proving a certain conjecture, which, translated back
into Haskell and made more specific to make it easier to think about,
looks like this (assuming Control.Applicative and Control.Arrow are
imported):

"For all applicative functors:

\f x -> fmap second f <*> fmap ((,) (0::Int)) x

is equivalent to

\f x -> fmap ((,) (0::Int)) (f <*> x)"

Using the laws from the Control.Applicative haddock page, and some puzzling:

First of all, to avoid getting lost in parenthesis hell, define:
  let g = (,) (0::Int)
  let c = (.)

     fmap second f <*> fmap g x
 law: fmap*2
<=>  (pure second <*> f) <*> (pure g <*> x)
 law: composition
<=>  (pure c <*> (pure second <*> f)) <*> pure g <*> x
 law: interchange
<=>  pure ($g) (pure c <*> (pure second <*> f)) <*> x
 law: composition
<=>  pure c <$> pure ($g) <*> pure c <*> (pure second <*> f) <*> x
 law: homomorphism*2
<=>  pure (c ($g) c) <*> (pure second <*> f) <*> x
 simplify
<=>  pure (. g) <*> (pure second <*> f) <*> x
 law: composition
<=>  pure c <*> pure (. g) <*> pure second <*> f <*> x
 law: homomorphism*2
<=>  pure (c (. g) second) <*> f <*> x
 rewrite (unpl)
<=>  pure (\ d u -> (0,d u)) <*> f <*> x
 rewrite some more
<=>  pure (c g) <*> f <*> x
 law: homomorphism
<=>  pure c <*> pure g <*> f <*> x
 law: composition
<=>  pure g <*> (f <*> x)
 law: fmap
<=>  fmap g (f <*> x)

Q.E.D.

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

Reply via email to