I ♥ Haskell

I knew there was a tighter way to write the derangement code for my assignment, but my Haskell was really rusty and what I had was fast, so I gave up. This morning it came to me – now I have 5 lines instead of 8. I do not have any idea how one would express this in pseudo code, though and it’s probably really quite difficult to read if you’re not familiar with Haskell.

derange1 :: Int -> [[Int]]
derange1 x = perm 0 (makeList x)

makeList :: Int -> [Int]
makeList 0 = []
makeList n = makeList (n-1) ++ [n]

perm :: Int -> [Int] -> [[Int]]            
perm _ [] = [[]]
perm x list = concat [map (e:) (perm (x+1) (delete e list)) |
                                       e <- list, e /= (x+1)]

It’s sometimes surprising how having less can 1) be more work and 2) feel like such an achievement.