
On Wed, 17 Jun 2009, Bertram Felgenhauer wrote:
roconnor@theorem.ca wrote:
I have a new proposal to add swap and swap' to Data.Tuple
I'd ask the opposite of Neil's question - what is a good use case for the extra laziness that swap provides over swap'? It seems to fill a rather small niche to me.
let foo x [] = (x,0); foo x (y:xs) = let !z = x + y in swap (foo z xs) in foo 0 [0..1000000] The above runs fine while let foo x [] = (x,0); foo x (y:xs) = let !z = x + y in swap' (foo z xs) in foo 0 [0..1000000] causes a stack overflow in GHC.
To provide the extra laziness, my favourite haskell compiler will have to create and later evaluate two thunks in addition to allocating a new pair.
I think we should be as lazy as possible in general, because lazier code supports more (data) fixpoint definitions than strict code. Adding strictness is generally used as an optimization, and adding it as default would be prematurely optimize *everyone's* code.
In other words, I'd rather add only one function,
swap (a, b) = (b, a)
-- Russell O'Connor http://r6.ca/ ``All talk about `theft,''' the general counsel of the American Graphophone Company wrote, ``is the merest claptrap, for there exists no property in ideas musical, literary or artistic, except as defined by statute.''