[Haskell-beginners] Simple function comparison

Francesco Ariis fa-ml at ariis.it
Wed Nov 25 14:20:48 UTC 2015


On Wed, Nov 25, 2015 at 11:39:15AM +0000, Stephen Renehan wrote:
> Hi,
> 
> I'm looking to do a comparison between 2 simple functions to see if
> they are equivalent but I appear to be running into some problems if
> anyone can help.
> 
> The two functions I want to compare are f (g a) and g (f a).
> 
> I have f defined and g defined as
>  f :: a -> a
>  f = undefined
> 
> g :: a -> a.
> g =  undefined
> 
> The compiler was complaining about the type signature lacking a
> binding so added undefined to get around the error. I understand that
> I must be missing something very basic as they look incomparable in
> this form. Any suggestions of what changes I should make such a
> comparison practical?

Hello Stephen,
    I don't think there is a way to /prove/ f (g a) == g (f a) if their
domain is not finite inside Haskell (you could do it with pen and
paper).

If you have two functions and a finite domain you can do, say:

    -- function function domain
    compfun :: (Eq a) => (a -> a) -> (a -> a) -> [a] -> Bool
    compfun f g d = and $ map (\x -> (f . g) x == (g . f) x) d

    λ> compfun (+1) (+17) [1..10]
    True
    λ> compfun (*5) (+17) [1..10]
    False

Of course this is a toy example, use a proper library (quickcheck, etc.)
if you are writing a real program.



More information about the Beginners mailing list