開発環境
- 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 コメント:
コメントを投稿