RosettaCodeData/Task/Word-frequency/Haskell/word-frequency-1.hs
2023-07-01 13:44:08 -04:00

41 lines
1.2 KiB
Haskell

module Main where
import Control.Category -- (>>>)
import Data.Char -- toLower, isSpace
import Data.List -- sortBy, (Foldable(foldl')), filter -- '
import Data.Ord -- Down
import System.IO -- stdin, ReadMode, openFile, hClose
import System.Environment -- getArgs
-- containers
import Data.Map.Strict (Map)
import qualified Data.Map.Strict as M
import qualified Data.IntMap.Strict as IM
-- text
import Data.Text (Text)
import qualified Data.Text as T
import qualified Data.Text.IO as T
frequencies :: Ord a => [a] -> Map a Integer
frequencies = foldl' (\m k -> M.insertWith (+) k 1 m) M.empty -- '
{-# SPECIALIZE frequencies :: [Text] -> Map Text Integer #-}
main :: IO ()
main = do
args <- getArgs
(n,hand,filep) <- case length args of
0 -> return (10,stdin,False)
1 -> return (read $ head args,stdin,False)
_ -> let (ns:fp:_) = args
in fmap (\h -> (read ns,h,True)) (openFile fp ReadMode)
T.hGetContents hand >>=
(T.map toLower
>>> T.split isSpace
>>> filter (not <<< T.null)
>>> frequencies
>>> M.toList
>>> sortBy (comparing (Down <<< snd)) -- sort the opposite way
>>> take n
>>> print)
when filep (hClose hand)