« [和訳] Announcing the F# 2.0 Standalone Tools Update (for .NET 2.0, 4.0 and other CLI Implementations) | トップページ | 書籍『実践 F# 関数型プログラミング入門』を書きました »

2010/12/09

[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
mapii
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
iterii
forall
forall2
toArray
toList

value
強化系
build
変化系
effect
放出系
ejection
操作系
management
具現化系
creation
特質系
spec
制約
constraint
head
nth
find
tryFind
findIndexi
tryFindIndexi
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

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.f.cocolog-nifty.com/t/trackback/253814/38018609

この記事へのトラックバック一覧です: [F#] SEQUENCE×SEQUENCE:

» F# 初体験、F# はやっぱり .NET でした。 [ナオキにASP.NET(仮)]
このエントリは F# Advent Calendar jp 2010 の第13回のものです。 今思い返すと F# 一度も触れたことがない私がこの Calendar に何故登録したのか… そして、いつの間にか私のところまで順番が回ってきていました。何も考えてない…(;´ρ`)... [続きを読む]

受信: 2010/12/21 19:06

« [和訳] Announcing the F# 2.0 Standalone Tools Update (for .NET 2.0, 4.0 and other CLI Implementations) | トップページ | 書籍『実践 F# 関数型プログラミング入門』を書きました »