[Haskell-cafe] Re: Aren't type system extensions fun?

Chris Smith cdsmith at twu.net
Tue May 27 11:23:39 EDT 2008


Thomas Davie wrote:
> This is perhaps best explained with an example of something that can be
> typed with rank-2 types, but can't be typed otherwise:
> 
> main = f id 4
> 
> f g n = (g g) n

That's certainly interesting.  Here's another interesting example.  In an 
old blog post of mine...

    http://cdsmith.wordpress.com/2007/11/29/some-playing-with-derivatives/

I was doing my first playing around with automatic differentiation.  It 
turns out that the type that's inferred for the AD function diff there 
can sometimes lead to incorrect behavior.  Barak Pearlmutter pointed out 
such a case in the comments:

    diff (\x -> (diff (x*) 2)) 1

This mixes several variables on which one is performing a derivative, and 
leads to confusion between the various derivatives.  The result is a 
wrong answer.  The version with rank 2 types, which are the types you 
really want here, catches this error at compile time.  (Granted, it would 
be nice to get the correct answer; but an error is infinitely superior to 
the wrong answer!)

As I mentioned in the article, though, rank 2 types have their own 
problems, in that one needs many versions of the function: one for each 
subclass of Num.

-- 
Chris



More information about the Haskell-Cafe mailing list