Apple公式のSwiftドキュメントが手に入り、他にも多数の関連書籍がすでに出版されているにもかかわらず、なぜ本書を書こうと思ったのでしょうか?また新たに出現したプログラミング言語について、なぜまた新たな書籍が必要とされるのでしょうか?
本書は、読者のみなさんに「関数的に」考えることを学んでもうらうための本です。Swiftは、関数型プログラムを書く方法を読者のみなさまに説明するための適切な言語機能を持っていると考えています。しかし、何がプログラムを「関数型」にするのでしょうか?そもそもなぜ関数型プログラミングを学ばなければならないのでしょうか?
関数型プログラミングに正確な定義を与えることは困難です。それはオブジェクト指向プログラミングや他のパラダイムに正確な定義を与えることが困難であることと同じです。本書では、その定義の代わりとして、Swiftを使ってうまくデザインされていると我々が考える関数型プログラムが持つ、いくつかの特性に注目します。
モジュラー性:関数型プログラマーは、プログラムを代入とメソッド呼び出しの連続と捉えるのではなく、各プログラムはより小さなコンポーネントに繰り返し分解できること、そしてこれらすべてのコンポーネントを関数適用で組み合わせることでプログラム全体を構成することを重点的に考えます。もちろん、この大きなプログラムを小さなコンポーネントに分解するということは、各コンポーネント間での状態の共有を避けることによってのみ成立します。これは次のポイントにつながります。
変更可能な状態の慎重な取り扱い:関数型プログラミングは「値指向プログラミング」であると(半ば揶揄として)言われることがあります。オブジェクト指向プログラミングでは、カプセル化された状態を持つクラスとオブジェクトのデザインに注力します。しかし関数型プログラミングでは、値によるプログラミングの重要性を強調し、変更可能な状態やその他の副作用には関わりません。関数型プログラムは、変更可能な状態を避けることでより簡単に命令型やオブジェクト指向で書かれたプログラムと組み合わせられます。
型:そして最後に、うまくデザインされた関数型プログラムは「型」を有効利用します。コードの構造化には、データや関数の型を注意深く選択することが最も役立ちます。Swiftは、強力な型システムを持っています。これを効率的に利用すれば、コードをより安全でより強固にできます。
これらは、Swiftプログラマーが関数型プログラミングコミュニティから学べる重要な知識であると考えています。本書を通して多くの例やケーススタディでこれらのポイントを説明します。
我々の経験上、関数的な考え方を学ぶことは簡単ではありません。これまでに学んできた問題の分解方法とは違います。for
ループに慣れきったプログラマーにとっては、再帰で混乱するかもしれません。代入文やグローバルな状態変数が存在しないことも足かせになります。そして、クロージャやジェネリック型、高階関数やモナドは何か異質なものに見えます。
本書の読者には、Objective-C(または他のオブジェクト指向言語)でのプログラミング経験があることを想定しています。Swiftの基礎やXcodeでのプロジェクトのセットアップなどの説明は本書で行いませんが、必要に応じてAppleの公式ドキュメントの参照リンクを提供します。もしあなたがプログラミングを始めたばかりであれば、本書はまだ読むべき本ではないかもしれません。Swiftプログラムを問題なく読むことができ、クラスやメソッド、変数など、プログラミングにおける一般的な考え方に慣れていなければ厳しいでしょう。
本書では、関数型プログラミングにまつわる謎を解き、人々が関数型プログラミングに対して感じるであろう偏見を取り除きたいと思っています。よりよいコードを書くために、数学の博士号は必要ありません!また、関数型プログラミングがSwiftでプログラムを書くための唯一の方法であるというわけでもありません。関数型プログラミングを学ぶことは重要なツールを新たに手に入れることであり、どの言語を使う場合であってもより優れた開発者になれると考えています。