On Tue, 18 Feb 2003, Aaron Denney wrote:
With a recursive function of more than one argument, does it make sense to keep the arguments that tend to remain constant closer to the front?
I.e. is this:
interp :: a -> [a] -> [a] interp y [] = [] interp y (x:[]) = x:[] interp y (x:xs) = x:y:interp y xs
any better than this:
interp :: [a] -> a -> [a] interp [] y = [] interp (x:[]) y = x:[] interp (x:xs) y = x:y:interp xs y
Will any implementations notice interp y x:xs calls interp y, and keep some sort of interp y partial application around?
(I don't really expect any effect like this, but even if there were one, I would expect consideration like the fact that "interp constant" is a useful function, while "\x -> interp x const-list" is not so useful to outweigh any such effect. Happily, they don't conflict here. If there is no effect like this, would it make any sense to try to get something similar by hand, and can this actually be done?)
GHC used to have an optimisation for static argument like this. It would turn both of the above programs into a similar form using a local recursive function: interp y xs = interpaux xs where interpaux [] = [] interpaux (x:[]) = x:[] interpaux (x:xs) = x:y:interpaux xs GHC doesn't do this anymore. The reason for this is unknown to me. /Josef