Haskell-入出力

Haskellの入出力について

Haskellは純粋関数型プログラミング言語です。

純粋関数型言語では、関数は同じ入力値に対して常に同じ出力値が返し、同じ入力に対して異なる出力をするような内部状態(副作用)を持ちません。つまり、関数は何か返り値を返す以外に文字列を出力する操作を直接行うことは許されないということです。


Haskellの入出力は、関数が入出力命令を出すことはなく、副作用が必要な仕事を処理系にまかせます。

入出力に関連する関数は入出力用のデータを処理系に返すことのみを行います。

例えば、putStrLn関数は引数として与えられた文字列を端末に出力するのではなく、「文字列を出力する」という指示を表した処理系依存のデータ構造を持った値を返します。

そして、その値を受け取った処理系が実際の入出力を行います。


#!/usr/bin/env runghc

main = putStrLn "haskell input/output."

標準入出力

標準入出力に関連する主要関数は以下の通りです。

getChar 標準入力から一文字の入力を受け付ける
getLine 標準入力から一行分の入力を受け付ける
getContents 標準入力の全てを受け付ける
putChar 標準出力へ一文字の出力を行う
putStr 標準出力へ文字列の出力を行う
putStrLn 改行コードをつけて標準出力へ文字列の出力を行う
print show(値を文字列に変換する関数)とputStrLnに相当します

以下のプログラムは標準入力から一行読み込み、標準出力に出力します。


$ cat io_haskell.hs 
#!/usr/bin/env runghc

import IO;
main = do buff <- getLine
          print buff

$ ./io_haskell.hs 
haskell
"haskell"

ファイルの読み書き

ファイル読み書き用の関数は、Preludeの標準関数を用いる方法と、module IOを利用した詳細な処理方法があります。


Preludeの標準関数

以下の関数を用いることで、基本的なファイル操作を実現できます。

writeFile :: FilePath -> String -> IO () StringをFilePathに書き込みます。
appendFile :: FilePath -> String -> IO () StringをFilePathに追記します。
readFile :: FilePath -> IO String |FilePathからIO Stringを読み込みます。

以下のプログラムはviewの引数で指定したファイルの内容を出力します。


#!/usr/bin/env runghc

view filename = do
    text <- readFile filename
    putStrLn text

main = view "./record.txt"

module IOの関数

module IOを利用することで、ファイルハンドラを用いた細かいファイル操作が可能となります。


#!/usr/bin/env runghc

import IO;

view filename = do
   hfile <- openFile filename ReadMode
   text <- hGetContents hfile
   putStrLn text
   hClose hfile

main = view "./record.txt"

「>>=」演算子

「>>=」演算子を用いると、入力と出力を合成することができます。

実際には、文字列を一行読み込み、その文字列を「出力することを指示する値」を取得します。


$ cat cat.hs 
#!/usr/bin/env runghc

main = getLine >>= putStrLn

$ ./cat.hs 
haskell
haskell


関連ページ