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

http://d.hatena.ne.jp/kazu-yamamoto/searchdiary?of=90&word=*[Haskell] をちょろっとみて,気になったので書いてみた.
まずは九九の1〜5までをリストで生成.mapと再起.

kuku           :: (Num a) => [a] -> [a] -> [[a]]
kuku [] ln     = []
kuku (x:xs) ln = (map (* x) ln) : kuku xs ln

main   :: IO ()
main = print $ kuku [1..5] [1..5]
bash-3.2$ runhaskell.exe kuku.hs
[[1,2,3,4,5],[2,4,6,8,10],[3,6,9,12,15],[4,8,12,16,20],[5,10,15,20,25]]

リストを文字列として出力するプログラム.

main = print $ rowToLine [1..5]

rowToLine :: (Show a) => [a] -> String
rowToLine = concatMap (\x -> " " ++ (show x) ++ " ")
bash-3.2$ runhaskell.exe kk.txt
" 1  2  3  4  5 "

最終的にできたプログラム.pretykuku関数にご注目.unlinesは行のリストを連結して文字列にし,各行の末尾に改行文字を付加する.

kuku           :: (Num a) => [a] -> [a] -> [[a]]
kuku [] ln     = []
kuku (x:xs) ln = (map (* x) ln) : kuku xs ln

main   :: IO ()
main   = print $ pretykuku $ kuku [1..5] [1..5]

rowToLine :: (Show a) => [a] -> String
rowToLine = concatMap (\x -> " " ++ (show x) ++ " ")

pretykuku :: (Show a) => [[a]] -> String
pretykuku = unlines . (map rowToLine)
bash-3.2$ runhaskell.exe kk.txt
" 1  2  3  4  5 \n 2  4  6  8  10 \n 3  6  9  12  15 \n 4  8  12  16  20 \n 5  10  15  20  25 \n"