Haskell-無名関数
無名関数とは
無名関数とは、一時的に使用するために使い捨てる前提で生成する、名前の無い関数です。
Haskellではラムダ式(ラムダ関数)を記述することで無名関数を定義することが出来ます。
ラムダ関数(lambda calculus)とは
ラムダ関数とは、文字ラムダ (λ) を使った式によって表記する関数です。
ラムダ式で記述された関数は、一時的な使い捨ての関数として利用することができます。
なお、ラムダ関数は、匿名関数(無名関数)とも呼ばれます。
無名関数のメリット
- 1度だけ使う関数をわざわざ定義しなくてよくなるため、ソースコードの構造を綺麗にします。
- 謝った関数名を防ぐ。
- 関数の名前は、関数の処理内容を表す名前にすることがソースコードの保守性を向上させます。処理内容と異なる名前を付けてしまうことで、第三者に謝った理解をさせてしまうことがあります。
- 関数の名前を考える手間がかからない。
- ソースコード実装時に関数名が決まらず悩むことや、関数名を修正するような手間がかからなくなります。
無名関数の作成
無名関数の形式
無名関数は「\ (バックスラッシュ)」の後に仮引数を並べて書き、「->」の後に本体を書きます。
なお、先頭にバックスラッシュを置くのは、ギリシャ文字のラムダ(λ)に似ているからといわれています。
\ 引数 -> 式
以下の式は、引数3つ(xyz)を加算する無名関数を作成し、無名関数に対して値(1、2、3)を渡していることを意味します。
Prelude> (\ x y z -> x + y + z) 1 2 3
6
無名関数への変形
以下のプログラムは、通常形式の関数です。
ここで、addは2つの引数を加算する関数という意味になります。
#!/usr/bin/env runghc
add :: Integer -> (Integer -> Integer)
add x y = x + y
main = print $ add 3 4
無名関数にします。
ここでは、addは「2つの引数を加算する無名関数」を生成する関数という意味になります。
#!/usr/bin/env runghc
add :: Integer -> (Integer -> Integer)
add = (\ x y -> x + y)
main = print $ add 3 4
無名関数の応用
map関数に無名関数を渡す
マッピングを行う高階関数mapは、第一引数には関数、第二引数にはリストとり、結果をリストとして返します。
第一引数に無名関数(2を加算する関数)を設定して、第二引数に整数値のリストを渡すことで、第二引数のリスト要素すべてを2加算したリストを作成することができます。
Prelude> map (\x -> x + 2) [1,2,3,4]
[3,4,5,6]