構造的演算

純関数

さて、これまであるシンボル f に対して関数 f[...] を定義する方法を述べてきましたが、SAD にはこのようなシンボル f を使わなくても定義できる関数の形式があります。これを純関数 pure function と呼びます。純関数は構造的演算に際して多用されます。

純関数1 演算子 & とSlot

例えば、(Sin[#] / Cos[#2])&[a, b] ⇒ Sin[a] / Cos[b] など。

純関数それ自身は評価されても形を変えません。

純関数の中で純関数を含む式を多重に使用することは可能です。ただし、その場合、Slot と引き数の対応がわかりにくくなることが避け難いので、なるべくならば With により純関数に名前をつけるなどの工夫が望ましいでしょう。また、場合によっては Slot ではどうしても引き数の対応ができない場合も発生します。

純関数2 Function

純関数の多重使用により、Slot による対応が不可能なときには Function を用いて Slot によらない引き数の対応をおこなう純関数を定義できます。

構造的演算とは

SAD では個々の原子、リストの要素に対しては勿論様々な演算が可能ですが、それ以上にあるリストや式の全体に対して一度に演算をすることができます。例えば、算術演算はリストに対してはその要素に並列に作用することは既に述べました。実は一般の関数に対してもそのような演算が可能です。ここではリストや式の全体に作用させる演算を「構造的演算」と呼ぶことにします。構造的演算の代表的なものが Map (演算子 /@)と Apply (演算子 @@) です。これらは SAD ではきわめて多用されるため、特別な演算子まで与えられています。

いま、ある2階のリスト l があるとして、その各要素の長さを要素とするリストを造りたいとしましょう。この問題は Map(/@) を使えば、

   Length /@ l

だけで書くことが出来ます。一般にある関数 f に対して、f /@ {a_1, a_2, ...} は {f[a_1], f[a_2], ...} を実行します。

次に、数値を要素とするあるリスト l に対して、その合計、平均値、2 乗平均値を求めたいとします。これらは Apply(@@) を使って、それぞれ

   Plus @@ l
   Plus @@ l / Length[l]
   Plus @@ (l^2) / Length[l]

と書かれます。一般にある関数 f に対して、f @@ {a_1, a_2, ...} は f[a_1, a_2, ...] を実行します。

この様に、構造的演算により、複雑な演算をきわめて簡潔に書くことが出来ます。構造的演算は単に簡潔さだけでなく、実行速度の向上にも寄与します。しかし、構造的演算を一つの式の中で幾重にも重ねますと、プログラムの可読性は低下してしまいますので注意してください。

様々な構造的演算

以下において演算の作用するリストは必ずしも頭部が List である必要はありません。

これらの内、Map, MapAll, MapIndexed, Apply, Scan, Cases, DeleteCases に対しては、階数指定子 (Level を参照) により演算の範囲を指定できます。

Map, /@

MapAll, //@

MapIndexed

Apply, @@

Scan

ScanThread

Position

Count

Cases

DeleteCases

MapAt

MapThread

Nest

Select

SwitchCases

SelectCases


トップ   差分 バックアップ リロード   一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2015-12-25 (金) 10:53:19