09

16

[Haskell] Haskellで 九九の表 を作る

2012.09.16(22:00)

スタートHaskell2 第4回で出題された 「Haskellで九九の表を作る」 について改めて考えてみる (kuku.hs)

データを作る関数、データの書式を整えて文字列を作る関数、それを標準出力する関数の3つに分離して、それぞれを作ることにする。純粋な部分と不純な部分を分けて作る。

まず九九の値が入ったデータを作る。

{-# OPTIONS -Wall -Werror #-}
import Text.Printf
 
kuku2 :: [[Int]]
kuku2 = [map(*i)[1..9]|i<-[1..9]]
 
1つのIntをStringにするには、Text.Printf.printf が使える。それを[Int]の要素に適用して1行分作れるようにする。
is :: Int->String
is n = printf "%2d " n
 
lis :: [Int]->String
lis ns = concat $ map is ns
 
それを全部の行に繰り返してIOアクションに渡して、九九の表を出力する。
main :: IO ()
main = mapM_ putStrLn $ map lis kuku2
 
ちなみに、全部をまとめて1行に書くとこうなるが、とても読みにくい。
main :: IO ()
main = mapM_ putStrLn $ map (\ns -> concat $ map (\n -> (printf "%2d "::Int->String) n) ns) [map(*i)[1..9]|i<-[1..9]]
 
これは、リストに入った文字列をまとめて連結するようにしている。
それとは別に、文字列を前から順番に連結するバージョンを作ってみる。
lis2 :: [Int]->String
lis2 [] = ""
lis2 (n:ns) = is n ++ lis2 ns
 
これを使って、九九の表を出力する。
main :: IO ()
main = mapM_ putStrLn $ map lis2 kuku2
 
さらに、右畳込みを使えるように準備する。
foldrは
foldr::(a->b->b)->b->[a]->b
だから aをInt、bをStringとして
foldr::(Int->String->String)->String->[Int]->String
として使えるように、第1引数として使う関数を準備する。
iss :: Int->String->String
iss n s = (printf "%2d " n) ++ s
 
第2引数は文字列の単位元の""、第3引数は九九の1行分がはいった[Int]を渡し、九九の表を出力する。
main :: IO ()
main = mapM_ putStrLn $ map (foldr iss "") kuku2
 
これも同じ結果が得られる。

実行結果
C:>ghc kuku
[1 of 1] Compiling Main             ( kuku.hs, kuku.o )
 
C:>kuku
 1  2  3  4  5  6  7  8  9
 2  4  6  8 10 12 14 16 18
 3  6  9 12 15 18 21 24 27
 4  8 12 16 20 24 28 32 36
 5 10 15 20 25 30 35 40 45
 6 12 18 24 30 36 42 48 54
 7 14 21 28 35 42 49 56 63
 8 16 24 32 40 48 56 64 72
 9 18 27 36 45 54 63 72 81
 
プロフィール

島敏博

Shima Toshihiro 島敏博
信州アルプスハイランド在住。HaskellとElixirが好き。組み込みソフトウェアアーキテクト、C++プログラマ、山歩き、美術館巡り、和食食べ歩き、日本赤十字社救急法指導員、インデックス投資、クラシック音楽、SESSAME会員、状態マシン設計、モデル駆動開発、ソフトウェアプロダクトライン、Rubyist、実践ビジネス英語

■ ツイッター
http://twitter.com/saltheads
■ Facebook
http://www.facebook.com/saltheads
■ Qiita
http://qiita.com/saltheads

印刷する場合は、ブラウザの印刷メニューではなく、このページの上から3cmくらいの青いところにある、「印刷」を押してみてください。少しうまく印刷できます。まだ完全ではないのですが、これで勘弁してください。


カテゴリ
最新記事
月別アーカイブ
最新コメント
検索フォーム
リンク
sessame
RSSリンクの表示