ようこそ。睡眠不足なプログラマのチラ裏です。

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


練習問題

■標準入力を行単位でソートするコマンドsort

import 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]]