理想未来ってなんやねん

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

Haskell 3日目

高階関数

例えば、次のような関数

map squre [1, 2, 3]

この式ではsquare関数がmap関数の第1引数として使われている。
squareがmap関数の第1引数、[1, 2, 3]がmap関数の第2引数となっている。
map関数のように他の関数を引数にとる関数のことを、高階関数(higher order function)と呼ぶ。


map関数の型は、

map :: (a -> b) -> [a] -> [b]

のようになっている。
(a -> b)が第1引数の型、[a]が第2引数の型、[b]が返り値である。

if式

if式は次のように書く

if 条件式 then1 else2

条件式の値がTrueであれば式1を返し、Falseなら式2を返す。
Haskellのifは次の特徴がある

  • 文ではなく式で、常にif式全体が値をもつ。
  • elseは省略できない。
  • 条件式の値は真偽値(TrueかFalse)でなければならない。違う場合は型エラーが起こる。

パターンマッチ

パターンマッチとは、値のパターンによって場合分けする手法。

例えば、以下のプログラム例

tabStop = 8

main = do cs <- getContents
          putStr $ expand cs

expand :: String -> String
expand cs = concatMap expandTab cs

expandTab :: Char -> String
expandTab '\t' = replicate tabStop ' '
expandTab c = [c]

expandTab '\t' = replicate tabStop ' '

の部分。

expandTab関数の引数が'\t'の場合にのみ定義が使われ、その他の場合は、

expandTab c = [c]

が使われる。

リストに対するパターンマッチ

map関数の定義

map :: (a -> b) -> [a] -> [b]
map f []     = []
map f (x:xs) = f x : map f xs

以下の部分が、空リストだけにマッチするパターン

map f []     = []

以下の部分がリストに対するパターンマッチ

map f (x:xs) = f x : map f xs

『(x:xs)』がリストに対するパターンで、このパターンは空リスト以外のリストにマッチする。
マッチしたときにはリストの最初の要素にxが束縛され、第2要素以降のリストにxsが束縛される。

今日のところはここまで