
dropTrailNulls list = reverse (dropWhile null (reverse list))
Or more succinctly: dropTrailNulls = reverse . dropWhile null . reverse
Or, is there a more efficient idiom for addressing these problems?
The "bad thing" about this definition is that it is tail strict. Consider ["hello","everyone","","","","",... <forever>] With your definition you will get nothing back (since reverse is tail strict). However, there is an alternative definition that will give the first two elements back: dropTrailNulls x = f 0 x where f n [] = [] f n ([]:xs) = f (n+1) xs f n (x:xs) = replicate n [] ++ (x : f 0 xs) -- note: untested, may not work The reason is because it is significantly more lazy. It is also more space efficient, and probably faster. However, despite all this, I love the reverse . something . reverse example, and I think its totally beautiful in terms of simplicity. The general programming advice holds here as for everywhere else - write beautifully, if performance demands, profile then write to obtain speed. Thanks Neil