第4章. 関数型データ構造
この作品はAIを使って翻訳されている。ご意見、ご感想をお待ちしている:translation-feedback@oreilly.com
データ構造はコンピュータサイエンスの基礎概念である。アルゴリズムと並んで、コンピュータサイエンスの学生やプログラマがマスターしなければならないものの定番である。関数型パターンという言葉があるように、関数型データ構造はコードの規範の中で一貫した定義を持つ確立された概念ではない。
本書では、、2つのものを関数型データ構造と呼ぶことにする。
-
Option,Either,Try,Listのような関数パターンで使われる関数である。これらはモナドである。 -
リンクリストのように、状態を変化させないように関数的に実装された通常のデータ構造。
この章では、最初の種類の関数型データ構造を扱い、関数型で実装された通常のデータ構造にまつわる考え方を簡単に説明する。特定のデータ構造を見る前に、文献で議論されている関数型データ構造についての考え方に触れておこう。まず、アラン・パーリスからの引用である:
10個の関数が10個のデータ構造で演算するよりも、100個の関数が1個のデータ構造で演算する方が良い。
熟練した関数型プログラマは、リンクリスト、配列、ハッシュテーブル、Option 、Either 、Try などのデータ構造を使う傾向がある。次にこれらについて見ていこう。この引用の背景にある考え方は、データ構造を少なくすることで、コードベースがより統一され、シンプルになるということだと思う。では、特に機能的なデータ構造を見てみよう。まずはOption 。
オプションのデータ構造
私は、Option という言葉を、言語的に中立な(特定のプログラミング言語の一部としてではなく)という意味で使っている。さまざまなプログラミング言語がこのデータ構造のバージョンを持っており、そのいくつかを例として挙げるが、まずはそのアイデアを具体化しよう。私たちの議論は、null 構造から始める必要がある。Nullは、、存在しないかもしれない値、オプションの値、値がわからない状況などに使われる。null 、変数にオブジェクトが含まれていて、その変数の値がnull 、そのオブジェクトに対してメソッドが呼び出された場合、プログラムはヌル・ポインタ例外を投げるという問題がある。例外は参照透明性を壊すので、関数型プログラマには嫌われる。null の発明者であるトニー・ホーアは、これは彼の10億ドルの過ちだと言っている:
私はこれを10億ドルの過ちと呼んでいる。それは1965年のヌル参照の発明だった。当時、私はオブジェクト指向言語(ALGOL W)において、参照のための最初の包括的な型システムを設計していた。私の目標()は、コンパイラが自動的にチェックを行うことで、すべての参照の使用が絶対的に安全であることを保証することだった。しかし、実装が簡単だからという理由だけで、NULL参照を入れたいという誘惑には勝てなかった。これが無数のエラー、脆弱性、システム・クラッシュを引き起こし、過去40年間におそらく10億ドルの苦痛と損害を与えた。1
しかし、null 、オプショナルなデータや値を持たない可能性のあるデータをどのように扱えばいいのだろうか?さて、null の主な問題のひとつは、型がないことだ。もし、値がない場合やオプショナルな場合を表す型を作成できるとしたらどうだろう?そのようなものは多くの言語に存在する。存在しない言語でも、作成は難しくない。この型を参照する方法はいくつかあるが、そのほとんどに ...