
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