|
|
Line 1: |
Line 1: |
− | This is a useless piece of code that counts and prints the number of times each character in the English alphabet occurs in a string. This version is hard-coded to read from the file "hi.txt", but it can easily be modified to interact with standard IO or read a file passed on the command line. The most interesting part is the use of currying to generate the counting functions.
| |
| | | |
− | <haskell>
| |
− | --system to show character frequencies in a set of strings
| |
− | import System.IO
| |
− | import Data.Char(toLower)
| |
− |
| |
− | --letters to scan for
| |
− | letters = ['a'..'z']
| |
− |
| |
− | --counts the ocurences of a particualr letter
| |
− | countLetters :: Char -> [Char] -> Int
| |
− | countLetters target str = length (filter (\c -> c == target) str)
| |
− |
| |
− | --creates a curryed version of countletters for a particular letter
| |
− | makeCounter :: Char -> ([Char] -> Int)
| |
− | makeCounter c = countLetters c
| |
− |
| |
− | --creates a countLetters funciton for each letter in the alphabet
| |
− | counters :: [([Char] -> Int)]
| |
− | counters = map makeCounter letters
| |
− |
| |
− | frequencies :: [([Char] -> Int)] -> [Char] -> [Int]
| |
− | frequencies [] _ = []
| |
− | frequencies (f:fs) cs = (f cs) : frequencies fs cs
| |
− |
| |
− | freqs :: [Char] -> [(Char, Int)]
| |
− | freqs cs = zip letters (frequencies counters cs)
| |
− |
| |
− | --make pretty output
| |
− | prettyPrint :: (Char, Int) -> String
| |
− | prettyPrint (c, n) = [c] ++ ":" ++ (show n) ++ "\n"
| |
− |
| |
− | printList :: [(Char, Int)] -> String
| |
− | printList [] = []
| |
− | printList ((c, i):frs) = ((c:[]) ++ ": " ++ (show i) ++ "\n") ++ printList frs
| |
− |
| |
− | --io and main program
| |
− | main = do
| |
− | str <- readFile "hi.txt"
| |
− | let out = (freqs (map toLower str))
| |
− | putStrLn $ printList out
| |
− |
| |
− |
| |
− | </haskell>
| |