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]


関連ページ