「高階関数」の版間の差分

削除された内容 追加された内容
Meniv (会話 | 投稿記録)
→‎種類: 直積の節を https://en.wikipedia.org/w/index.php?title=Outer_product&oldid=622365509 を参考に追加。ソース例を付加
45行目:
Prelude> (2 +) 3
5
</source>
 
=== filter ===
リストの各要素に対して与えられた条件式を適用し、真であるものだけをリストにまとめて返すものである。単純な条件式の代わりに真偽値を与える関数を指定したとき、高階関数であると言える。
<source lang="scheme">
(filter func list)
</source>
 
例えば、リスト'(1 2 -3 -4 5)から、正の数のみを抽出するには以下のようにする<ref>http://www.shido.info/lisp/scheme8.html</ref>。
<source lang="scheme">
(filter positive? '(1 2 -3 -4 5))
;=> '(1 2 5)
</source>
 
=== zip ===
複数のリストからタプルを要素とする1つのリストを生成する。
<source lang="scheme">
(zip list1 list2 ... listn)
</source>
 
例えば、'(1 2 3)と'(a b c)に対してzipを行うと以下のようになる。
<source lang="scheme">
(zip '(1 2 3) '(a b c))
;=> '((1 a) (2 b) (3 c))
</source>
 
=== unzip ===
zipの逆操作。タプルを要素とする1つのリストから複数のリストを生成する。
<source lang="scheme">
(unzip list)
</source>
 
schemeには実装されていないが実装されていれば以下のように動作する:
<source lang="scheme">
(unzip '((1 a) (2 b) (3 c)))
;=> '(1 2 3) '(a b c)
</source>
 
ただし、実際には単一の戻り値しか返せない処理系・言語の場合、この戻り値のタプルとして返すことがある。その場合は以下のようになる。
<source lang="scheme">
(unzip '((a b c) (s t u) (x y z) (1 2 3)))
;=> ((a s x 1) (b t y 2) (c u z 3))
(unzip '((a s x 1) (b t y 2) (c u z 3)))
;=> ((a b c) (s t u) (x y z) (1 2 3))
</source>
 
=== map ===
''map''関数はリスト構造の各要素に対して順々に与えられた関数を処理していくものである。[[関数型言語以外プログラミング]]ではないパラダイムの言語でも実装されていることがある。
<source lang="scheme">
(map func list0 list1 ... listN)
58 ⟶ 102行目:
;=> '(2 3 4)
</source>
 
=== filter ===
リストの各要素に対して与えられた条件式を適用し、真であるものだけをリストにまとめて返すものである。単純な条件式の代わりに真偽値を与える関数を指定したとき、高階関数であると言える。
 
=== fold ===
''fold'' 関数は重畳、堆積、[[畳み込み]]や折り畳みなどと呼ばれ、英語では''reduce''、''inject''とも表現される。foldはリストの各要素に対して与えられた関数を適用する。
<source lang="scheme">
(fold func returns-first list)
</source>
 
例えば、リスト'(1 2 3)の各要素の総和を取るには以下のようにできる。
<source lang="scheme">
(fold + 0 '(1 2 3))
;=> 4
</source>
 
右方向の畳み込み(''foldr'')と左方向の畳み込み(''foldl'')があり、[[プログラミング言語|言語]]によっては最初から同様の機能が組み込まれていることがある(詳しくは[[:en:Fold (higher-order function)|foldの英語版記事]]の該当項目を参照)。
74 ⟶ 124行目:
=== unfold ===
foldの逆変換。すなわち初期値から何らかの動作を行なってリストを生成する関数である。例えるならば[[漸化式]]を[[数列]]に直す操作に相当する。
<source lang="scheme">
(unfold condition func iterate-update seed)
</source>
seedにfuncを適用しfuncの戻り値をリストへ格納し、seedをiterate-updateで更新してfuncを適用しfuncの戻り値をリストへ格納し、…といった操作をseedがconditionを真にするまで繰り返す。
 
例えば、要素4からリスト'(3 2 1)を生成するには、以下のようにする。
<source lang="scheme">
(unfold zero? (lambda(x)x) (lambda (n) (- n 1)) 3)
;=> '(3 2 1)
</source>
 
=== 直積 ===
複数のリストそれぞれを要素とするタプルを返す関数と見た時、[[直積集合]]を求める演算も高階関数と考えられる。R言語のouter関数などで実装されている。
 
== 手続き型言語における高階関数 ==