理想未来ってなんやねん

娘可愛い。お父さん頑張る。

Haskell 4日目

Haskellの勉強4日目
今日は第4章 モジュールと総合演習です。

コマンドライン引数の処理とモジュール

echoコマンドのソースコードを引用します。

import System

main = do args <- getArgs
          putStrLn $ unwords args

他のモジュールで定義されている関数などを使いたいときにはimport宣言を使う。
getArgsはコマンドライン引数を読み込むアクション。アクションの結果は文字列のリスト。
unwordsはリストの各要素を空白を挟んで連結して文字列にする。

上のソースは引数を読み込んで、空白を挟んで連結し標準出力に出力する。

モジュール

importがわかったので、標準のモジュールにどんなものがあるのか調べてみた。
他にもあるだろうが、P.251に書かれているものを列挙する。

モジュール名 内容
Prelude 言語の基本的な関数、型、型クラスなど
Ratio 有理数
Complex 複素数
Numeric 数値
Ix 値と整数とのマッピング
Array 配列
List リストに関連したユーティリティ
Maybe Maybeモナド
Char 文字に関連したユーティリティ
Monad モナドに関連したユーティリティ
IO 入出力
Directory ディレクトリ(フォルダ)の操作
System コマンドライン引数や環境変数など
Time 日付や時刻
Locale ロケール
CPUTime CPU時間の取得
Random ランダムな数値の取得

Preludeモジュール(Prelude module)は基本的な型や関数が定義されており、暗黙のうちにインポートされる。
getContentsやlines関数、リストや整数などの型もPreludeモジュールで定義されている。

総合演習

fgrepコマンドのソースコードを引用します。

import System
import List

main = do args <- getArgs
          cs <- getContents
          putStr $ fgrep (head args) cs

fgrep :: String -> String -> String
fgrep pattern cs = unlines $ filter match $ lines cs
  where
    match :: String -> Bool
    match line = any prefixp $ tails line

    prefixp :: String -> Bool
    prefixp line = pattern `isPrefixOf` line

新しい機能がでて、ちょっと楽しくなってきましたね。


where節は後置型の構文で、ある式だけに有効な定義を導入する。

where 定義1
         定義2
         定義3

特定の関数内だけで使う関数を定義したいときに使う。

head関数はリストの最初の要素を返す。
filter関数は第2引数で指定したリストの各要素に第1引数で指定した関数を適用した結果がTrueになる要素だけをリストとして返す関数。

any関数は、第2引数で指定したリストの各要素に、第1引数で指定した関数を適用し、そのいずれかの値がTrueならTrueを返す関数。

tails関数は、第1引数で指定したリストそのもの、第1引数で指定したリストの第2要素以降、第1引数で指定したリストの第3要素以降、・・・をリストにして返す関数。

例えば、

tails [1, 2, 3, 4]

の場合、

tails [[1, 2, 3, 4], [2, 3, 4], [3, 4], [4], []]

というリストになる。

isPrefixOf関数は第1引数で指定したリストが第2引数の先頭に一致するときにTrueを返す。
pattern `isPrefixOf` lineのように、2引数の関数を``で囲むと、その関数があたかも中間演算子のように使えるようになり、英語らしく読めるので理解しやすくなる。


今日のところはここまで。
明日は第2部、第5章 遅延評価に入ります。