import Data.List (delete, sort)
-- 1ª definición
minimaDiferencia1 :: (Num a, Ord a) => [a] -> a
minimaDiferencia1 xs =
minimum [abs (x - y) | x <- xs, y <- delete x xs]
-- 2ª definición
minimaDiferencia2 :: (Num a, Ord a) => [a] -> a
minimaDiferencia2 [x,y] = abs (x - y)
minimaDiferencia2 (x:xs) = min (minimum [abs (x - y) | y <- xs])
(minimaDiferencia2 xs)
-- 3ª definición
minimaDiferencia3 :: (Num a, Ord a) => [a] -> a
minimaDiferencia3 xs =
minimum [y - x | (x,y) <- zip ys (tail ys)]
where ys = sort xs
-- Comparación de eficiencia
-- λ> minimaDiferencia1 [1..2*10^3]
-- 1
-- (3.47 secs, 1,419,790,688 bytes)
-- λ> minimaDiferencia2 [1..2*10^3]
-- 1
-- (0.78 secs, 684,030,712 bytes)
-- λ> minimaDiferencia3 [1..2*10^3]
-- 1
-- (0.02 secs, 0 bytes)
--
-- λ> minimaDiferencia2 [1..5*10^3]
-- 1
-- (5.14 secs, 4,233,952,776 bytes)
-- λ> minimaDiferencia3 [1..5*10^3]
-- 1
-- (0.02 secs, 0 bytes)