[Haskell-cafe] Word rigid in "`a' is a rigid type variable..."

Albert Y. C. Lai trebla at vex.net
Fri Nov 15 22:25:59 UTC 2013

"It could be any type" has always been a truism. It has never been an 
issue of contention. The issue has always been "but who gets to choose". 
Teachers and tutorial writers still don't address that up front and head 
on; they spend 99 minutes harping on "any", watch students fail, and 
finally spend 1 minute to reveal "but you don't choose". As opposed to 
revealing that in the 1st minute so everyone can save the other 99 
minutes. Perhaps they think that it is obvious to themselves, and need 
not be said to students. Perhaps they need to ensure a certain high 
variance in student marks.

Less flexibility for the provider equals more flexibility for the user. 
Less cavalier power for the writer equals more predictive power for the 
reader. Cavalier power has previously been known as convenience, 
flexibility, and expressive power, for the writer; extreme examples 
include self-modifying code and performing list operations on complex 
numbers (let us call that type cavalierism, so that we have a judgmental 
name for the antithesis to type safety); mild examples include type-case 
and allowing effects everywhere. Programming is a dialectic class 
struggle between the user and the provider, between the reader and the 

Given the type signature

     f :: a -> Bool

and the restriction of "no type-case" and "no effect" such as in 
Haskell, if a simple test results in f () = True, then I know f 5 = 
True, f "hello" = True, universally f x = True. I need just one test 
case, f (), to complement the type. This is from the free theorems that 
Phil Wadler talks about in the article "theorems for free!".

Perhaps f is a useless function. Here is a useful function:

     dpc :: a -> [a]

If a simple test results in dpc () = [(), (), ()], then I know dpc x = 
[x, x, x] universally. replicate 3 is, certainly, a useful function, at 
least for glue code. And it is important to know that I will not be 
trolled by "you get a list of 4 if the type is Double, and you get 
random numbers in the list if the type is Int". The writer's loss of 
cavalier power is my gain of predictive power.

Your freedom is my slavery.
Your ignorance is my strength.
Your war is my peace.

Customers who like this article may also like the following from the 
same author:
and this talk (50 minutes) from another author:

More information about the Haskell-Cafe mailing list