import Data.List (sort)
pandigitalesMultiplos :: [Integer]
pandigitalesMultiplos =
sort [y | x <- [1..a],
y <- productosCon9Digitos x,
esPandigital y]
where a = head [x | x <- [1..], producto x [1,2] > 987654321]
-- (productosCon9Digitos x) es la lista de los productos de x por una
-- lista [1,2,...,n] (con n > 1) que tienen 9 dígitos, Por ejemplo,
-- productosCon9Digitos 3 == [369121518]
-- productosCon9Digitos 2 == []
productosCon9Digitos :: Integer -> [Integer]
productosCon9Digitos x | numeroDeDigitos z == 9 = [z]
| otherwise = []
where z = head [y | n <- [2..],
let y = producto x [1..n],
numeroDeDigitos y >= 9]
-- (producto x ys) es el producto de x por ys. Por ejemplo,
-- producto 2 [3,2,5] == 6410
producto :: Integer -> [Integer] -> Integer
producto x = read . concatMap (show . (x*))
-- (numeroDeDigitos x) es el número de dígitos de x. Por ejemplo,
-- numeroDeDigitos 425 == 3
numeroDeDigitos :: Integer -> Int
numeroDeDigitos = length . show
-- (esPandigital x) se verifica si x es pandigital. Por ejemplo,
-- esPandigital 192384576 == True
-- esPandigital 192314576 == False
-- esPandigital 1923145761 == False
esPandigital :: Integer -> Bool
esPandigital n = sort (show n) == "123456789"
-- La lista de los pandigitales múltiplos se calcula por
-- ghci> pandigitalesMultiplos
-- [123456789, 192384576, 219438657, 273546819, 327654981, 672913458,
-- 679213584, 692713854, 726914538, 729314586, 732914658, 769215384,
-- 792315846, 793215864, 918273645, 926718534, 927318546, 932718654]