[F#] SEQUENCE×SEQUENCE
この記事は F# Advent Calendar jp 2010 の第3回目です。
Seq モジュールの関数/値について、それらの持つ能力から分類してみます。すなわち、念能力列能力による分類。
列能力とは、シーケンスと呼ばれるジェネレーターを自在に操る能力。シーケンスの使われ方によって6つの系統に分類される。なお、列能力によって発揮される技を特に、「値」あるいは「関数」と呼ぶ。以降で各系統別に列能力を解説し、また関連する制約という観念について見た後で、値の一覧を示す。
強化系(build)
シーケンスの持つ要素の質を高める能力。シーケンスを加工して、新たなシーケンスを構築するものであり、多くの関数がこれに分類される。
また、具現化系以外の系統の能力とも相性がよく、他の系統との複合技となるものも多い。
代表的な関数は map。
変化系(effect)
シーケンスを何か別の型に変える能力。シーケンスと別の型との変換という点では具現化系と共通点のある系統であるが、変化形はシーケンスから別の型への評価であり、具現化系はその逆、別の型をもととしたシーケンスの生成である。
特筆すべきは、変化形の能力によってシーケンスの実体化が行われ、遅延実行性が失われることである。この能力によって、シーケンスの要素は必ずすべてジェネレートされる。ただし、変化系の能力のみを持つ関数では即座に実体化されるが、強化系との複合関数である場合は実体化の効果が遅延される。
代表的な関数は fold。
放出系(ejection)
要素をシーケンスから切り離して取得する能力。単一要素の取り出しだけでなく、複数要素を新たなシーケンスとして取り出すこともできる。
シーケンスの遅延実行性を利用した無限シーケンスからの必要分取得も、放出系が得意とする能力である。
単一要素の取得に代表的な関数は find、複数要素の取得に代表的な関数は take。
操作系(management)
2つ以上のシーケンスを操って何か行う能力。連結操作(UNION)、合弁操作(JOIN)の2つの操作形態がある。他の能力との複合でその効果が発揮されることが多い。
連結操作に代表的な関数は append、合弁操作に代表的な関数は zip。
具現化系(creation)
シーケンスをインスタンス化する能力。シーケンス、すなわちジェネレーターを具現化するのであって、ジェネレーターを実行して要素実体を取り出すことではない。
各種シーケンスを自在にインスタンス化するまでには相当に強いイメージ力が必要だが、パターン化できてしまえば、その豊富な記述力が絶大な効果を発揮する。
代表的な関数は unfold。
特質系(spec)
他の5系統に分類できない特殊な能力。
代表的な関数は cache。
制約(constraint)
列能力の分類ではないが、それに関わる重要な観念として制約について説明する。
制約を決めて、それを遵守するとコンパイラに誓うことで、実装力を向上させことができる。適用するシーケンスに直接的な制約と、間接的な制約とがある。
値の一覧
Seq モジュールに定義されるすべての値の、列能力の系統と制約について、以下の表に一覧する。
値がその系統にあたる場合は○で示す。その系統の能力を有しないものの、似通って見える性質を持つものには※でそれを示す。また、特質系においてよく知られた効果であるインデックスについては、i によって特に示す。
制約に関しては、直接的な制約を○で、間接的な制約を△で示す。
| 値 value | 強化系 build | 変化系 effect | 放出系 ejection | 操作系 management | 具現化系 creation | 特質系 spec | 制約 constraint |
|---|---|---|---|---|---|---|---|
| map | ○ | ||||||
| map2 | ○ | ○ | |||||
| mapi | ○ | i | |||||
| scan | ○ | ※ | |||||
| collect | ○ | ||||||
| filter | ○ | ||||||
| choose | ○ | ||||||
| distinct | ○ | ○ | |||||
| distinctBy | ○ | △ | |||||
| sort | ○ | ○ | ○ | ||||
| sortBy | ○ | ○ | △ | ||||
| countBy | ○ | ○ | △ | ||||
| groupBy | ○ | ○ | △ | ||||
| take | ○ | ○ | |||||
| truncate | ○ | ○ | |||||
| takeWhile | ○ | ○ | |||||
| skip | ○ | ||||||
| skipWhile | ○ | ||||||
| pairwise | ○ | ||||||
| windowed | ○ | ||||||
| 値 value | 強化系 build | 変化系 effect | 放出系 ejection | 操作系 management | 具現化系 creation | 特質系 spec | 制約 constraint |
| length | ○ | ||||||
| max | ○ | ○ | |||||
| maxBy | ○ | △ | |||||
| min | ○ | ○ | |||||
| minBy | ○ | △ | |||||
| sum | ○ | ○ | |||||
| sumBy | ○ | △ | |||||
| average | ○ | ○ | |||||
| averageBy | ○ | △ | |||||
| reduce | ○ | ||||||
| fold | ○ | ||||||
| iter | ※ | ○ | |||||
| iter2 | ※ | ○ | ○ | ||||
| iteri | ※ | ○ | i | ||||
| forall | ○ | ||||||
| forall2 | ○ | ○ | |||||
| toArray | ○ | ||||||
| toList | ○ | ||||||
| 値 value | 強化系 build | 変化系 effect | 放出系 ejection | 操作系 management | 具現化系 creation | 特質系 spec | 制約 constraint |
| head | ○ | ||||||
| nth | ○ | ||||||
| find | ○ | ||||||
| tryFind | ○ | ||||||
| findIndex | ○ | i | |||||
| tryFindIndex | ○ | i | |||||
| pick | ※ | ○ | |||||
| tryPick | ※ | ○ | |||||
| exists | ※ | ○ | |||||
| exists2 | ※ | ○ | ○ | ||||
| compareWith | ※ | ○ | ○ | ||||
| append | ○ | ||||||
| concat | ○ | ○ | ○ | ||||
| zip | ○ | ||||||
| zip3 | ○ | ||||||
| singleton | ○ | ||||||
| init | ○ | ||||||
| initInfinite | ○ | ||||||
| delay | ○ | ||||||
| unfold | ○ | ||||||
| cast | ○ | ○ | |||||
| ofArray | ○ | ||||||
| ofList | ○ | ||||||
| 値 value | 強化系 build | 変化系 effect | 放出系 ejection | 操作系 management | 具現化系 creation | 特質系 spec | 制約 constraint |
| empty | ※ | ○ | |||||
| isEmpty | ○ | ||||||
| cache | ○ | ○ | |||||
| readonly | ○ | ○ |
まとめ
言わずもがなこれはネタ記事で、本当はもっとマジメに分類した方がいいような気もしますが、それをやりだすと結局のとこ、個々の値/関数を深く知るほかないという身も蓋もないとこに落ち着きそうなので、こういうのも割とありなんじゃないか。とか。
というわけで。次は名古屋のターン!?
| 固定リンク
« [和訳] Announcing the F# 2.0 Standalone Tools Update (for .NET 2.0, 4.0 and other CLI Implementations) | トップページ | 書籍『実践 F# 関数型プログラミング入門』を書きました »



コメント
まさかHUNTERXHUNTERネタで来るとは・・・
ネタとかいいつつこの表普通に便利ですね。笑
某書籍にも載せたかったぐらいだ・・・!(な、なんだってー!
投稿: のぶひさ | 2010/12/10 02:20