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