Difference between revisions of "Stupid Curry Tricks"
Jump to navigation
Jump to search
Tomjaguarpaw (talk | contribs) (Deleting page that hasn't been edited for over 10 years) |
m (Reverted edits by Tomjaguarpaw (talk) to last revision by Eric Gesell) |
||
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> |
Latest revision as of 15:18, 6 February 2021
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.
--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