Mathematica 9 is now available
THIS IS DOCUMENTATION FOR AN OBSOLETE PRODUCT.
SEE THE DOCUMENTATION CENTER FOR THE LATEST INFORMATION.
Mathematica >
Mathematicaチュートリアル関数 »|チュートリアル »

純関数

Function[x,body]xbody で指定される任意引数で置換することで得られる純関数を定義する
Function[{x1,x2,...},body]複数の引数を取る純関数を定義する
body&引数が,1つなら #,複数なら #1, #2, #3等と指定された純関数を定義する

純関数の定義

NestMap等の関数操作が使われるとき,適用される関数は必ず指定されなければならない.これまでに示した例では,関数の「名前」を明記することでこれを行ってきた.純関数と呼ばれる式の構成形式を使うことで,関数名を宣言しなくても,引数に適用させることができる関数を定義することができる.
関数hを定義する.
In[1]:=
Click for copyable input
hは,すでに定義済みなのでMapで直接使うことができる.
In[2]:=
Click for copyable input
Out[2]=
このように純関数を使っても同じ結果を得ることができる.
In[3]:=
Click for copyable input
Out[3]=
純関数を宣言する方法がいくつか用意されている.どの方法を使おうが基本的な考えは,適切な引数が与えられるときに特定の関数を計算してくれるオブジェクトを構築することにある.例えば,fun が純関数なら,fun[a]は,a を引数としこの関数を評価する.
xの2乗を取る操作を表した純関数を定義する.
In[4]:=
Click for copyable input
Out[4]=
定義した純関数に引数nを与えると,nの2乗の答が返されてくる.
In[5]:=
Click for copyable input
Out[5]=
純関数は,通常の名前付き関数が使えるところであれば同様に使うことができる.
純関数をMap式の中で使うこともできる.
In[6]:=
Click for copyable input
Out[6]=
Nestでも使うことができる.
In[7]:=
Click for copyable input
Out[7]=
2引数の純関数を定義し,この関数を引数aおよびbに適用する.
In[8]:=
Click for copyable input
Out[8]=
関数を繰り返し使う場合は,f[x_]:=body の書式で関数を定義し,関数の参照はその名前f で行った方がよいだろう.しかし,関数を一度しか使わない場合は,関数をどう呼ぶかを考える必要がない純関数の形で関数を定義した方がよいだろう.
形式論理やLISPプログラミング言語に精通した読者なら,Mathematica の純関数が 式や,匿名関数に相当したものだと気が付いたかもしれない.また,純関数は,演算子に関する純粋に数学的な考えに近いものでもある.
#純関数における最初の変数
#n純関数におけるn 番目の変数
##純関数の持つすべての変数
##n純関数におけるn 番目以上のすべての変数

純関数で使われる短縮形

関数を繰り返し使わなければ名前を付けてもあまり意味がないように,純関数の引数に名前を付けてもあまり意味がない.Mathematica では,純関数を記述する際,特に引数に名前を付けなくてもよいようになっている.名前の代りに,#n の書式で引数の位置を指定するだけでよい.純関数では,#n は,n 番目に与える引数を指す.#だけだと第1引数を意味する.
#^2&は,引数の2乗を計算するための,短縮形で書かれた純関数である.
In[9]:=
Click for copyable input
Out[9]=
各リストから最初の2要素を抽出する関数を適用する.純関数を使ったので,関数を繰り返し定義する必要がなくなる.
In[10]:=
Click for copyable input
Out[10]=
fromdigitsは,一度「関数を反復的に適用する」で構築したが,短縮形で記述するとさらに簡単な形にすることができる.
In[11]:=
Click for copyable input
短縮形で純関数を構築するときは,式の末尾にアンド記号(&)を付けることを忘れないようにする.この記号がないと,式は純関数として認識されなくなってしまう.
アンド記号の短縮形を使う際に注意する点として,式のまとめ方がある.「演算子の入力形」で示すように,アンド記号はどちらかというと低い優先順位を持つ.このため,例えば,#1+#2&のような式は,カッコなしで記述することができる.その反面,書式option->(fun&)を使い,純関数全体を変換規則の一部として使うときはカッコがないと問題になる.
純関数は,引数をいくつでも取ることができる.##を使うことで,与えられるすべての引数を表すことができる.また,##n は,n 番目以上のすべての引数を表す.
##は,すべての引数を表してくれる.
In[12]:=
Click for copyable input
Out[12]=
##2は,最初を除いた全引数を表す.
In[13]:=
Click for copyable input
Out[13]=
Ask a question about this page  |  Suggest an improvement  |  Leave a message for the team