> One question I have is whether I can eliminate points in the above > definition of blowup, and write something like > > blowup = (++) . (blowup . allButLast, lastToTheLength) > > thinking of (++) as a function String x String -> String.
Actually (++) is of type String -> String -> String. When you want something of the type you mean (you normally write that as (String, String) -> String in Haskell, then you can use (uncurry (++)). Additionally, you can't combine the functions (blowup . allButLast) and lastToTheLength into a function that returns a pair like you seem to attempt. You need a function like the following for that: comma :: (a -> b) -> (a -> c) -> a -> (b,c) comma f g x = (f x, g x) Then you could say: blowup = (uncurry (++)) . comma (blowup . allButLast) lastToTheLength Ignore this if you haven't read about Applicative or type classes yet, but using the Applicative instance for arrow types (->) a, you can also write comma = liftA2 (,) or blowup = (uncurry (++)) . liftA2 (,) (blowup . allButLast) lastToTheLength > Also, I can't > figure out whether it is possible to get a shorter solution using fold. > I have tried Hlint on my file, but it gave no suggestions. > > I am sure there are better ways, and would like some pointers and any > general suggestions for improvement. By the way, shorter is not always better. Trying to recognize abstraction patterns in your code is never a bad thing though. Dominique _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe