-- anagram.hs: Program to find the anagrams of a word in a word list import Char import System import IO -- Remove one occurrence of an element from a list deleteOne e [] = [] deleteOne e (y:ys) | e == y = ys | otherwise = y : deleteOne e ys -- Test if the strings is an re-arrangements of each other anagram [] [] = True anagram [] ys = False anagram xs [] = False anagram (x:xs) ys = elem x ys && anagram xs (deleteOne x ys) printStrList = putStr . concat . map (++ "\n") main = do args <- getArgs case args of [string,file] -> do chars <- readFile file printStrList (filter (anagram string') (phrases chars)) where string' = filter isAlpha string phrases c = map (filter isAlpha) (lines c) [string] -> do chars <- getContents printStrList (filter (anagram string) (lines chars)) _ -> do putStr "Usage: " getProgName >>= putStr putStrLn " WORD [FILE]" putStrLn "List anagrams of WORD from FILE or standard input." exitWith (ExitFailure 1)