Hugs でディレクトリ操作

Hugs で使い捨てプログラムを作る場合、Unix ならフィルターを作れば簡単だ。たとえばファイルの内容を表示する cat のようなものは次のようにプログラムできる。

#!/usr/bin/runhugs

main = getContents >>= putStr

また、!ls のようにシェルコマンドの前に ! をつければHugsのコマンドラインからファイルリストを表示することができる。

WinHugs の場合はこのような芸当ができないので、まずディレクトリの情報を取得する方法から工夫しないといけない。ディレクトリの操作関係の関数は、Directoryモジュールの中にあるのでまずこれを load する。

Hugs> getCurrentDirectory
ERROR - Undefined variable "getCurrentDirectory"
Hugs> :load Directory
Directory>

現在のディレクトリのパスを得るには、getCurrentDirectory 関数を用いる。
Directory> getCurrentDirectory >>= print
"C:\\WinHugs"

ディレクトリ内のファイルのリストを取るには、getDirectoryContents 関数を用いる。
Directory> getDirectoryContents "C:/WinHugs" >>= print
[".","..","array.txt","btree.hs", ... (省略) ... ,"writedata.hs"]

リスト表記ではなくスペースで区切りたいときは、unwords 関数を使う。
Directory> getDirectoryContents "C:/WinHugs" >>= putStr . unwords
. .. array.txt btree.hs ... (省略) ... writedata.hs

現在のディレクトリのファイルリストを作りたいときは getCurrentDirectory と getDirectoryContents を組み合わせる。
Directory> getCurrentDirectory >>= getDirectoryContents >>= putStr . unwords
. .. array.txt btree.hs ... (省略) ... writedata.hs

IOモナドのプログラムは基本的にはモナドの世界の関数の出力を >>= でパイプして使うことになる。純粋関数の世界の関数は、putStr . unwords のように、モナドの世界の関数との合成関数として利用することになる。

do 記法を使えば、たとえば、

main = do cs <- getLine
          putStr cs

のように、手続き型のプログラム言語に似せて表記することができるが、本質的には上の関数の出力が下の関数の入力として渡されると考えなければならないので注意が必要だ。
[PR]
by tnomura9 | 2009-09-23 14:41 | Haskell | Comments(0)
<< Hugs で対話型プログラミン... 改行文字変換プログラム >>