import Data.List (unfoldr) import Control.Monad (forM_) import qualified Text.Blaze.Html5 as B import Text.Blaze.Html.Renderer.Pretty (renderHtml) import System.Random (RandomGen, getStdGen, randomRs, split) makeTable :: RandomGen g => [String] -> Int -> g -> B.Html makeTable headings nRows gen = B.table $ do B.thead $ B.tr $ forM_ (B.toHtml <$> headings) B.th B.tbody $ forM_ (zip [1 .. nRows] $ unfoldr (Just . split) gen) (\(x, g) -> B.tr $ forM_ (take (length headings) (x : randomRs (1000, 9999) g)) (B.td . B.toHtml)) main :: IO () main = do g <- getStdGen putStrLn $ renderHtml $ makeTable ["", "X", "Y", "Z"] 3 g