
On 3/18/11 11:12 AM, Max Bolingbroke wrote:
Furthermore, this solution would not help unless you did not have a Seq (a -> b) instance,
Exactly put.
but such an instance could be necessary to avoid some space leaks, since you can write stuff like:
case holds_on_to_lots_of_memory of True -> \x -> x-1 False -> \x -> x+1
So there are eminently practical reasons for polymorphic seq.
You can do more than avoid memory leaks with this sort of thing. In my current project I use tricks like this extensively in order to perform partial _evaluation_, thereby lifting shared computations out of loops and improving the computational complexity of the program. (As well as constant factors. The constant factors alone give ~10% speedup.) Of course, I am relying on the fact that I will never pass an undefined value to the resulting function (I hope). Otherwise, as mentioned elsewhere, performing the partial evaluation wouldn't be correct. One way to have this cake and eat it too would be if we explicitly distinguished between pointed and unpointed function spaces. It'd be perfectly fine to have, instance Seq (!a -> b) where seq = compilerMagic Since the types ensure that eta conversion won't affect semantics. -- Live well, ~wren