(プログラミング 小手調べ 解説)
ここまで高階関数を各言語で見てきた。基本的な考え方は同じであることが見てとれるだろう。
高階関数に、「何を」に相当する部分(それぞれの要素に対して適用させたい処理)を渡す際に、渡し方はいくつかあり、
これまでの例だと言語毎に違っているような印象を受けたかも知れないが、実際には、 いくつかのパターンに分類できる。
処理を無名関数として渡す時のルールを以下に整理しておく。
なお、ラムダ(ギリシア語のアルファベットで、英語の L に相当し、文字は 「λ」または「ぁΛ」、英語でのスペルはやや難読で “lambda”)という単語が出てくるが。
数学で関数を表す時に使われてた記号の名残が各プログラミング言語に残っているもの。
Ruby では、ブロックとして渡すのが一般的だったが、今はラムダ(と、それに似たものとしてProcオブジェクト)も使われる。
[1,2,3].map{|i|i+1} # do〜end でもいい
[1,2,3].map(&->(i){i+1})
[1,2,3].map(&lambda{|i|i+1})
[1,2,3].map(&Proc.new{|i|i+1})
[1,2,3].map(&:to_s)
Python では、lambdaというキーワードで表記する。
lambda i: i+1
JSでは、(最近は)ダブルアロー =>
(.language-javascript) で表現する。
(i)=>{i+1}
// または(前述のように)略記してもいい
i=>i+1
// 昔のjavascriptでは、キーワード function を使って書いていた(今も使われている)
function(i){i+1}
Haskell では ラムダの代わりに、文字 λ に形が似た記号としてバックスラッシュを使う。
map ( \i -> i + 1) [1..3]
なお、2引数の無名関数は、以下のように2つの書き方がある(後者がHaskellの正統な記法)
\x y -> x+y
\x -> \y -> x+y