開発環境
- OS X Lion - Apple(OS)
- Emacs、BBEdit - Bare Bones Software, Inc. (Text Editor)
- Haskell (プログラミング言語)
- GHC (The Glasgow Haskell Compiler) (処理系)
『初めてのプログラミング 第2版』(Chris Pine 著、長尾 高弘 訳、オライリー・ジャパン、2010年、ISBN978-4-87311-469-9)の8章(配列とイテレータ), 8.3(練習問題)、目次改訂版をHaskellで解いてみる。
その他参考書籍
- プログラミングHaskell (オーム社) Graham Hutton(著) 山本 和彦(翻訳)
- Real World Haskell―実戦で学ぶ関数型言語プログラミング (オライリージャパン) Bryan O'Sullivan John Goerzen Don Stewart(著) 山下 伸夫 伊東 勝利 株式会社タイムインターメディア(翻訳)
リスト、再帰関数、右畳み込み(foldr)
コード(BBEdit)
sample.hs
{-# OPTIONS -Wall -Werror #-} main :: IO () main = do putStrLn "再帰関数" putStrLn $ center cols "table of contents" putStrLn "" putStr $ formatContents contents putStrLn "右畳み込み" putStrLn $ center cols "table of contents" putStrLn "" putStr $ formatContentsFoldr contents contents::[(Int, String, Int)] contents = [(1, "start", 1), (2, "string", 11), (3, "number", 15)] cols :: Int cols = 40 colsHalf :: Int colsHalf = div cols 2 formatContents :: [(Int, String, Int)] -> String formatContents [] = "" formatContents ((a, b, c):xs) = ljust colsHalf ("chapter " ++ (show a) ++ ": " ++ b) ++ rjust colsHalf ("p." ++ (show c)) ++ "\n" ++ formatContents xs center :: Int -> String -> String center n xs = replicate half ' ' ++ xs where half = div (n - length xs) 2 ljust :: Int -> String -> String ljust n xs = xs ++ replicate (n - length xs) ' ' rjust :: Int -> String -> String rjust n xs = replicate (n - length xs) ' ' ++ xs -- 再帰関数だから、右畳みでも書いてみる formatContentsFoldr :: [(Int, String, Int)] -> String formatContentsFoldr = foldr (\(a, b, c) acc -> ljust colsHalf ("chapter " ++ (show a) ++ ": " ++ b) ++ rjust colsHalf ("p." ++ (show c)) ++ "\n" ++ acc) ""
入出力結果(Terminal, runghc)
$ runghc sample.hs 再帰関数 table of contents chapter 1: start p.1 chapter 2: string p.11 chapter 3: number p.15 右畳み込み table of contents chapter 1: start p.1 chapter 2: string p.11 chapter 3: number p.15 $
リスト、contentsのchapter番号をzipで生成するように改良。(出力結果は上記と同じ。)
コード(BBEdit)
sample.hs
{-# OPTIONS -Wall -Werror #-} main :: IO () main = do putStrLn "再帰関数" putStrLn $ center cols "table of contents" putStrLn "" putStr $ formatContents contents putStrLn "右畳み込み" putStrLn $ center cols "table of contents" putStrLn "" putStr $ formatContentsFoldr contents contents::[(Int, (String, Int))] contents = zip [1..] [("start", 1), ("string", 11), ("number", 15)] cols :: Int cols = 40 colsHalf :: Int colsHalf = div cols 2 formatContents :: [(Int, (String, Int))] -> String formatContents [] = "" formatContents ((n, (a, b)):xs) = ljust colsHalf ("chapter " ++ (show n) ++ ": " ++ a) ++ rjust colsHalf ("p." ++ (show b)) ++ "\n" ++ formatContents xs center :: Int -> String -> String center n xs = replicate half ' ' ++ xs where half = div (n - length xs) 2 ljust :: Int -> String -> String ljust n xs = xs ++ replicate (n - length xs) ' ' rjust :: Int -> String -> String rjust n xs = replicate (n - length xs) ' ' ++ xs -- 再帰関数だから、右畳みでも書いてみる formatContentsFoldr :: [(Int, (String, Int))] -> String formatContentsFoldr = foldr (\(n, (a, b)) acc -> ljust colsHalf ("chapter " ++ (show n) ++ ": " ++ a) ++ rjust colsHalf ("p." ++ (show b)) ++ "\n" ++ acc) ""
0 コメント:
コメントを投稿