content: import Data.List (transpose)
  import System.Environment (getArgs)
  import Text.Printf (printf)
  
  -- Pascal's triangle.
  pascal :: [[Int]]
  pascal = iterate (\row -> 1 : zipWith (+) row (tail row) ++ [1]) [1]
  
  -- The n by n Pascal lower triangular matrix.
  pascLow :: Int -> [[Int]]
  pascLow n = zipWith (\row i -> row ++ replicate (n-i) 0) (take n pascal) [1..]
  
  -- The n by n Pascal upper triangular matrix.
  pascUp :: Int -> [[Int]]
  pascUp = transpose . pascLow
  
  -- The n by n Pascal symmetric matrix.
  pascSym :: Int -> [[Int]]
  pascSym n = take n . map (take n) . transpose $ pascal
  
  -- Format and print a matrix.
  printMat :: String -> [[Int]] -> IO ()
  printMat title mat = do
    putStrLn $ title ++ "\n"
    mapM_ (putStrLn . concatMap (printf " %2d")) mat
    putStrLn "\n"
  
  main :: IO ()
  main = do
    ns <- fmap (map read) getArgs
    case ns of
      [n] -> do printMat "Lower triangular" $ pascLow n
                printMat "Upper triangular" $ pascUp  n
                printMat "Symmetric"        $ pascSym n
      _   -> error "Usage: pascmat <number>"
  