I wrote: |Thus, it would indeed be reasonable for the type of seq to determine |that f x `seq` y is all right, whereas f `seq` y is not permissible. |Similarly, I think it would be consistent to have unlifted products, |but not give them data instances, so that (x,y) `seq` z is not allowed, |the programmer needing to choose between x `seq` y `seq` z and |y `seq` x `seq` z. An equally reasonable approach would be to give such types instance declarations like the following: instance Data (a -> b) where seq f x = x instance Data (a,b) where seq p x = x Operationally, this would be like saying that any value of one of these types is already in head normal form, I suppose. --Joe