2013年10月8日火曜日

開発環境

『初めてのプログラミング 第2版』(Chris Pine 著、長尾 高弘 訳、オライリー・ジャパン、2010年、ISBN978-4-87311-469-9)の8章(配列とイテレータ), 8.3(練習問題)、目次改訂版をHaskellで解いてみる。

その他参考書籍

リスト、再帰関数、右畳み込み(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 コメント:

コメントを投稿