Haskellのお勉強 その5
モジュールとimport宣言
Haskellプログラムはモジュールという単位に分割されている。モジュールは関数や変数や型の集まりであり、
Haskellでは関数や変数は必ずなんらかのモジュールに属している。
他のモジュールで定義されている関数などを使いたい場合は、
import宣言(import declaration)を行う必要がある。
以下の場合は、Systemモジュールがインポートされ、
Systemモジュールが公開する関数や型などがすべて使えるようになる。
import System main = do args <- getArgs putStrLn $ unwords args
Mainモジュール
すべての関数や変数はモジュールに属しているということから、main変数も、なんらかのモジュールに属しているということが言える。
実はmain変数は、Mainモジュール(Main module)に属している。
モジュールの宣言を省略すると、暗黙的にそのファイル全体がMainモジュールとなり
そのモジュールはmain変数のみ公開するものとみなされる。
もちろん、Mainモジュールを明示的に宣言することもできるが、それについては第10章で学ぶとのこと。
where節
式 where 定義1 定義2 定義3 ・ ・ ・
特定の関数内だけで有効となる関数を定義するような場合、where節を使う。
また、where節を使って定義された関数は、その外側の関数の引数を参照することができる。
例えば、下記のプログラムの場合、match関数やprefixp関数からpatternやcsを参照することができる。
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
{-head関数-} --リストxsの最初の要素を取得します。 --凡例:head xs head :: [a] -> a {-tall関数-} --リストxsの最初の要素を除く要素のリストを取得します。 --凡例:tail xs tail :: [a] -> [a] {-filter関数-} --リストxsの各要素xに、fを適用し、結果がTrueである要素のリストすべてを取得します。 --凡例:filter f xs filter :: (a -> Bool) -> [a] -> [a] {-any関数-} --リストxsの各要素xに、fを適用し、そのいずれかの結果がTureである場合Trueを返します。 --すべての「f x」がFalseである場合Falseを返します。 --凡例:any f xs {-List.tailes関数-} --リストxsそのもの、リストxsの第2要素以降、リストxsの第3要素以降...のリストを取得します。 --tailes [1,2,3] → [[1,2,3],[2,3],[3],[]] --凡例:tails xs tailes :: [a] -> [[a]] {-List.isPrefixOf関数-} --リストxsがリストysの先頭に一致するときにTrueを返します。 --isPrefixOf xs ys isPrefixOf :: (Eq a) => [a] -> [b] -> Bool
練習問題
■標準入力を行単位でソートするコマンドsortimport List main = do cs <- getContents putStr $ unlines $ map sort (lines cs)
■同じ行が連続していらたら、それを1行にまとめるコマンドuniq
import List main = do cs <- getContents putStr $ unlines $ map head $ group (lines cs)
{-List.sort関数-} --リストxsの要素を昇順にソートしたリストを取得します。 --凡例: sort xs sort :: (Ord a) => [a] -> [a] {-List.group関数-} --リストxsに連続して同じ要素が現れたら、それをリストにまとめて取得します。 --凡例:group xs group :: (Eq a) => [a] -> [[a]]