Euler #4: Refined Palindrome in Haskell
Your code is fine, but I would suggest some small changes. Instead of head . transpose, I would use concatMap (take 1). This captures your intend to take the first (and therefore largest) number from each allPalindrome.

Next, I would use Int instead of (Integral a, Show a), since 999 * 999 is smaller than maxBound :: Int. Why? Because by default, Integer will be used for Integral types, if they were note specified. Therefore, you end up with maxPalindrome handled as a Integer, which is slower than Int.

And last, but not least, I would stop at 111, since 111 * 111 is a palindrome. 

We end up with:

isPalindrome :: Show a =&gt; a -&gt; Bool
isPalindrome n = l == reverse l
  where l = show n

maxPalindrome :: Int
maxPalindrome = maximum $ concatMap (take 1) $ allPalindrome &lt;$&gt; [999, 998 .. 111]
  where allPalindrome x = filter isPalindrome $ (x *) &lt;$&gt; [999, 998 .. x]

main :: IO ()
main = print maxPalindrome


Note that you should compile your code if you want to check its performance.

Alternatively, if you want to keep maxPalindrome's type, use :: Int:

maxPalindrome :: (Integral n, Show n) =&gt; n
maxPalindrome = maximum $ concatMap (take 1) $ allPalindrome &lt;$&gt; [999, 998 .. 111]
  where allPalindrome x = filter isPalindrome $ (x *) &lt;$&gt; [999, 998 .. x]

main :: IO ()
main = print (maxPalindrome :: Int)