import System.Random -- generate one random integer randInt :: Int -> Int -> IO Int randInt min max = do gen <- newStdGen return $ fst $ randomR (min,max) gen -- generate n random integers randInts :: Int -> Int -> Int -> IO [Int] randInts n min max = do let vals1 = [randInt min max | i <- [1..n]] vals <- sequence vals1 return vals -- convert a list of values into a histogram (one string per value) histogram :: (Enum a, Eq a, Ord a) => [a] -> [String] histogram vals = bars where counts = [length (filter (==i) vals) | i <- [(minimum vals)..(maximum vals)]] bars = [take n (repeat 'X') | n <- counts] -- print histogram of randomly-generated values printHisto :: IO () printHisto = do vals <- randInts 1000 1 20 let bars = histogram vals mapM_ putStrLn bars