開発環境
- OS X Mavericks - Apple(OS)
- BBEdit - Bare Bones Software, Inc., Emacs (Text Editor)
- Haskell (純粋関数型プログラミング言語)
- GHC (The Glasgow Haskell Compiler) (処理系)
- The Haskell Platform (インストール方法、モジュール等)
C実践プログラミング 第3版 (Steve Oualline (著)、 望月 康司 (監訳) (翻訳)、谷口 功 (翻訳)、オライリー・ジャパン)のⅢ部(高度なプログラミング概念)の18章(モジュールプログラミング)、18-14(プログラミング実習)、実習18-1.をHaskellで解いてみる。
その他参考書籍
- プログラミングHaskell (オーム社) Graham Hutton(著) 山本 和彦(翻訳)
- Real World Haskell―実戦で学ぶ関数型言語プログラミング (オライリージャパン) Bryan O'Sullivan John Goerzen Don Stewart(著) 山下 伸夫 伊東 勝利 株式会社タイムインターメディア(翻訳)
18-14(プログラミング実習)、実習18-1.
コード(BBEdit)
Sample.hs
{-# OPTIONS -Wall -Werror #-} import qualified Temp as T import qualified System.IO as IO import System.Environment main :: IO () main = do (a:b:_) <- getArgs inHandle <- IO.openFile a IO.ReadMode outHandle <- T.openFile b T.defineHeader outHandle "OUTPUT FILE" contents <- IO.hGetContents inHandle let ls = lines contents f 2 outHandle ls IO.hClose inHandle f :: Int -> IO.Handle -> [String] -> IO () f _ handle [] = T.closeFile handle f n handle (x:xs) = if n == 11 then do T.page handle f 1 handle xs else do T.printLine handle x f (n + 1) handle xs
コード(BBEdit)
Temp.hs
{-# OPTIONS -Wall -Werror *-} module Temp ( openFile, defineHeader, printLine, page, closeFile) where import qualified System.IO as IO openFile :: String -> IO IO.Handle openFile s = IO.openFile s IO.WriteMode defineHeader :: IO.Handle -> String -> IO () defineHeader handle heading = IO.hPutStrLn handle ("HEADER: " ++ heading) printLine :: IO.Handle -> String -> IO () printLine = IO.hPutStrLn page :: IO.Handle -> IO () page handle = IO.hPutChar handle '\f' closeFile :: IO.Handle -> IO () closeFile = IO.hClose
入出力結果(Terminal, runghc)
$ ghc --make Sample.hs [1 of 2] Compiling Temp ( Temp.hs, Temp.o ) [2 of 2] Compiling Main ( Sample.hs, Sample.o ) Linking Sample ... $ ./Sample Sample.hs Sample.hs.txt $ ./Sample Temp.hs Temp.hs.txt $ cat -nv Sample.hs.txt Temp.hs.txt 1 HEADER: OUTPUT FILE 2 {-# OPTIONS -Wall -Werror #-} 3 import qualified Temp as T 4 import qualified System.IO as IO 5 import System.Environment 6 7 main :: IO () 8 main = do 9 (a:b:_) <- getArgs 10 inHandle <- IO.openFile a IO.ReadMode 11 ^L T.defineHeader outHandle "OUTPUT FILE" 12 contents <- IO.hGetContents inHandle 13 let ls = lines contents 14 f 2 outHandle ls 15 IO.hClose inHandle 16 17 18 f :: Int -> IO.Handle -> [String] -> IO () 19 f _ handle [] = T.closeFile handle 20 f n handle (x:xs) = 21 ^L T.page handle 22 f 1 handle xs 23 else do 24 T.printLine handle x 25 f (n + 1) handle xs 1 HEADER: OUTPUT FILE 2 {-# OPTIONS -Wall -Werror *-} 3 module Temp ( openFile, 4 defineHeader, 5 printLine, 6 page, 7 closeFile) where 8 9 import qualified System.IO as IO 10 11 ^LopenFile s = IO.openFile s IO.WriteMode 12 13 defineHeader :: IO.Handle -> String -> IO () 14 defineHeader handle heading = IO.hPutStrLn handle ("HEADER: " ++ heading) 15 16 printLine :: IO.Handle -> String -> IO () 17 printLine = IO.hPutStrLn 18 19 page :: IO.Handle -> IO () 20 page handle = IO.hPutChar handle '\f' 21 ^LcloseFile :: IO.Handle -> IO () 22 closeFile = IO.hClose $
慣れるまでは{-# OPTIONS -Wall -Werror #-}の記述を消さずに細かく型を指定していくことに。
0 コメント:
コメントを投稿