九九を表示するプログラム

リスト内包表記を使って九九のリストを求めて、それを表示するようにしてみました。

module Main (main) where

import Text.Printf (printf)

kuku :: [(Int, Int, Int)]
kuku = [(i, j, i * j) | i <- [1 .. 9], j <- [1 .. 9]]

main :: IO ()
main = do
  header
  mapM_  f kuku
  where
    header = do
      putStr "  |"
      mapM_ (printf " %2d") ([1 .. 9] :: [Int])
      putStrLn ""
      putStrLn "--+----------------------------"

    f (i, 1, n) = printf "%2d| %2d" i n
    f (_, 9, n) = printf " %2d\n" n
    f (_, _, n) = printf " %2d" n

実行例:

$ ./kuku
  |  1  2  3  4  5  6  7  8  9
--+----------------------------
 1|  1  2  3  4  5  6  7  8  9
 2|  2  4  6  8 10 12 14 16 18
 3|  3  6  9 12 15 18 21 24 27
 4|  4  8 12 16 20 24 28 32 36
 5|  5 10 15 20 25 30 35 40 45
 6|  6 12 18 24 30 36 42 48 54
 7|  7 14 21 28 35 42 49 56 63
 8|  8 16 24 32 40 48 56 64 72
 9|  9 18 27 36 45 54 63 72 81

くくといっても"<<"ではありません(Ruby関西向け)。