import qualified Data.List import qualified Data.Map.Strict as Map import Data.Char (isAsciiLower) printRest :: [String] -> IO () printRest [] = return () printRest [x] = putStrLn x printRest (x:xs) = do putStr x putStr ", " printRest xs printAnagram :: [String] -> IO () printAnagram [] = return () printAnagram (x:xs) = do putStr x putStr ": " printRest xs main :: IO () main = do f <- readFile "/usr/share/dict/british-english-insane" let wordList = filter (all isAsciiLower) (lines f) let hashWords = [(hw, [w]) | w <- wordList, let hw = Data.List.sort w] let anagrams = Map.elems $ Map.fromListWith (\ x y -> y ++ x) hashWords let nonUniqueWords = Data.List.filter ((> 1) . length) anagrams mapM_ printAnagram $ Data.List.sortOn head nonUniqueWords