九九の表

この間のRuby勉強会のお題をHaskellでやってみました。久しぶりにHaskell使いました。カンが鈍ってます。

module Main (main) where

join :: [a] -> [[a]] -> [a]
join sep = foldl1 (\ ss s -> ss ++ sep ++ s)

kuku :: [[Int]]
kuku = [map (n *) [1 .. 9] | n <- [1 .. 9]]

formatKuku :: (Num a, Ord a) => [[a]] -> [[Char]]
formatKuku xs @ (h : _) = header : sep : map body xs
    where
      header = "   |" ++ (join " " $ map n2s h)

      sep = "---+--------------------------"

      body ns @ (n : _) = n2s n ++ " |" ++ (join " " $ map n2s ns)
      body _  = undefined

      n2s n
          | n < 0 = undefined
          | n < 10 = " " ++ show n
          | otherwise = show n 

formatKuku _ = undefined

main :: IO ()
main = mapM_ putStrLn $ formatKuku 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