ぷるぷるした直方体

元職業エンジニアの雑記です

Scala関数型デザイン&プログラミング 〜1章 (1)

"Scala関数型デザイン&プログラミング ―Scalazコントリビューターによる関数型徹底ガイド"を買いました。 少しずつ読んで、各章の内容をまとめてゆきます。

Scala関数型デザイン&プログラミング ―Scalazコントリビューターによる関数型徹底ガイド (impress top gear)

Scala関数型デザイン&プログラミング ―Scalazコントリビューターによる関数型徹底ガイド (impress top gear)

今回は1章。 本書の目的や関数型プログラミングについて触れられています。

本書に寄せて / まえがき

Odersky先生の寄せ書き、まえがきではこの本の目的について述べられています。

  • Scalaを純粋関数型プログラミング言語として扱う方法。美しいコードや計算の本質を見抜く力につながる
  • Scalaについての本ではなく、関数型プログラミングの入門書
  • プログラミングをある程度経験している人が対象
  • 今までのことは忘れ、初心に立ち返る必要がある
  • 関数型プログラミングが「今までやってきたことじゃないか」と思えたらサイコー。責任を分離したり、イミュータブルにしたり

徐々に抽象度を上げていく構成となっているようです。‌‌練習問題も用意されており、解答はGithubに上がっているので見てね、とのことです。

github.com

感想

関数型プログラミングを「今までやってきたこと」と捉えると良い、というのはナルホドと思いました。‌ ‌「関数型でなくても使える普遍的な考え方が、関数型であればより表しやすい」と言うのは実にシンプルで強力な説明です。

1章

1章では関数型プログラミングの概要について触れています。‌‌もちろん、純粋な関数型を前提としています。

コーヒーをクレジットカードで買う例を出し、副作用のあるプログラムを書き換えていくことで純粋関数の利点を示しています。‌‌ここで述べられている利点は以下の通りです。

  • テストしやすい
  • モジュラリティが高い

関数型の(時には厳しい)ルールに従うことにより、プログラムの構成が変わり、良いコードが出来上がるとの主張です。‌‌制約と誓約、要は念能力ですね。

続いて、純粋関数の説明が入ります。

  • 入力と出力が1:1対応する
  • 参照透明(式を常にその結果に置き換えることができる)

結果、関心ごとに関数を分離しやすく、モジュール性の高いプログラムになりやすいです。

感想

プログラミングにおいて制約は極めて重要です。‌‌そのため、いかに制約をつけるかで様々な手法が試されてきました。‌‌例えばPythonのインデントであり、契約プログラミングであり、静的型付けであり、全てがオブジェクトである言語であるわけです。制約と自由さ、このバランスをいかに取るかで言語設計者は頭を悩ませているかと思います。‌‌

その1つの提案が純粋関数型言語であり、副作用を制限するというかなり厳しい制約を背負っています。‌‌そのため同じ動作をさせようと思っても、様々な違いが出てきます。‌‌利点と欠点を見極めて、上手く使いこなせるようにしたいものですね。

続き blog.esplo.net