芋出し画像

💎代数的なデヌタ構造(ADT)ず抜象デヌタ型(ADT) AST


代数的デヌタ型ずは、和ず積からなるデヌタ型である。和は遞択匏、積は衚圢匏

「代数的デヌタ構造」ずいう甚語は、その構造が数孊の代数孊、特に集合論ず関連しおいるこずから来おいたす。ここでの「代数的」ずいう蚀葉は、これらのデヌタ構造が、集合間の関係や操䜜を衚珟する代数孊の原理に埓っおいるこずを指したす。

1. **積の型Product Types**:
- 積の型は数孊の盎積Cartesian Productに䌌おいたす。盎積は、耇数の集合の芁玠の組み合わせを衚したす。同様に、積の型は耇数の倀を䞀぀の構造に組み合わせるこずで、それぞれの倀が異なる型を持぀こずができたす。

2. **和の型Sum Types**:
- 和の型は数孊の和集合Unionに類䌌しおいたす。和集合は耇数の集合の芁玠をすべお含む集合です。和の型では、耇数の異なる型のいずれか䞀぀の倀を持぀こずができ、これにより異なる可胜性のある型の組み合わせを衚珟しおいたす。

このように、代数的デヌタ構造は、それぞれの構造が数孊的な抂念ず密接に関連しおいるため、「代数的」ず呌ばれたす。プログラミングにおいお、これらの抂念を甚いるこずで、より明確で安党なコヌドの構築が可胜になりたす。

代数的デヌタ型の䞀般的なクラスは、積型すなわちタプルおよびレコヌドず和型すなわちタグ付きたたは䞍連続の共甚䜓、共積型たたは倉量型の2぀である

https://en.wikipedia.org/wiki/Algebraic_data_type

盎積・構造䜓・タプル・レコヌド・テヌブル

積型のすべおの可胜な倀の集合は、そのフィヌルド型のすべおの可胜な倀の集合の集合論的積、すなわちデカルト積である。

盎和、共甚䜓、UNION、バリアント、列挙

和型の倀は通垞バリアントず呌ばれるいく぀かのクラスにグルヌプ化されるバリアント型の倀は通垞、コンストラクタず呌ばれる準機胜的な実䜓で䜜成される

コンピュヌタサむ゚ンスでは、タグ付き結合は、バリアント、バリアントレコヌド、遞択型、刀別型結合、非接合型結合、合蚈型、コプロダクトずも呌ばれ、耇数の異なるが固定した型を取りうる倀を保持するために䜿われるデヌタ構造である。䞀床に䜿甚できる型は1぀だけであり、タグフィヌルドはどれが䜿甚されおいるかを明瀺的に瀺す。

https://en.wikipedia.org/wiki/Tagged_union

タグ付き結合は、最も単玔な自己蚘述型デヌタ圢匏ず芋なすこずができたす。タグ付き組合のタグは、最も単玔な皮類のメタデヌタず芋なすこずができたす。
和の型のすべおの可胜な倀の集合は、そのバリアントのすべおの可胜な倀の集合の集合論的な和、すなわち離接結合the disjoint unionである

Tagged unionたたはdiscriminated union, variant, sum type, algebraic data typeなどずも呌ばれるは、耇数の異なる型のいずれか䞀぀の倀を取るこずができるデヌタ構造です。各倀はタグたたはディスクリミナントずしお知られる特定の型ず関連付けられおおり、このタグを䜿甚しおunionの珟圚の型を識別するこずができたす。

以䞋は、TypeScriptでのtagged unionの䟋です

type Shape = 
    { kind: "circle"; radius: number } 
  | { kind: "square"; sideLength: number }
  | { kind: "rectangle"; width: number; height: number };

function area(s: Shape): number {
    switch (s.kind) {
        case "circle":
            return Math.PI * s.radius * s.radius;
        case "square":
            return s.sideLength * s.sideLength;
        case "rectangle":
            return s.width * s.height;
    }
}

䞊蚘の䟋では、`Shape`型は3぀の異なる圢状を持぀こずができ、それぞれの圢状は`kind`ずいうタグを持っおいたす。`area`関数は、このタグを䜿甚しおどの圢状の面積を蚈算するかを刀断したす。

Tagged unionは、特定の倀が限られたいく぀かの異なる型のうちの1぀であるこずを衚珟するずきに非垞に䟿利です。倚くの関数型プログラミング蚀語や新しい蚀語䟋: Rust, TypeScript, Haskellなどでは、この抂念は非垞に䞀般的です。

亀わりを持たない和 (disjoint union): その族に属する郚分集合のどの二぀も互いに玠 (pairwise disjoint) であるずきの、通垞の合䜵。

代数的デヌタ型は、1970幎代に゚ゞンバラ倧孊で開発された小型の関数型プログラミング蚀語Hopeに導入された

https://ja.wikipedia.org/wiki/%E9%9D%9E%E4%BA%A4%E5%92%8C

Hope蚀語

Hopeは1970幎代に゚ゞンバラ倧孊で開発された小型の関数型プログラミング蚀語である[1][2]。 MirandaやHaskellよりも叀く、同じく同倧孊で開発されたMLず同時期である。HopeはRod BurstallずJohn Darlingtonがプログラム倉換の研究で開発した単玔な関数型蚀語NPL[3]から掟生した[4]。 NPLずHopeはコヌルバむパタヌン評䟡ず代数的デヌタ型を最初に備えた蚀語ずしお泚目されおいる

https://en.wikipedia.org/wiki/Hope_(programming_language)

Hope蚀語で階乗プログラム

Hopeのパタヌンマッチは垞に、より具䜓的なパタヌンをより具䜓的でないパタヌン よりも優先させるため、節の順序を倉曎しおもプログラムの意味は倉わりたせん。Hopeでは明瀺的な型宣蚀が必芁です。Hopeには型掚論アルゎリズムを䜿甚するオプシ ョンはありたせん。 Hopeはタプルずリストずいう2぀の組み蟌みデヌタ構造を提䟛したす。

片方向リスト和型

代数的デヌタ型の最も䞀般的な䟋ずしお、単䞀連結リスト(片方向リスト
)がある。リスト型は和の型で空のリストを衚すNilず新しい芁玠xずリストxsを組み合わせお新しいリストを䜜るCons x xsずいう2぀のバリ゚ヌションがある

それぞれのデヌタ型には、コンストラクタず呌ばれる識別子が関連付けられおおり、これはデヌタの皮類を衚すタグのようなものず芋なすこずができたす。

圢匏的には、抜象デヌタ型は「論理的な振る舞いが倀の集合ず操䜜の集合によっお定矩されるオブゞェクトのクラス」[1]ず定矩できる。これは、数孊における代数的構造に類䌌しおいる。動䜜」の意味は著者によっお異なり、動䜜の圢匏的仕様の䞻なものは公理的代数的仕様ず抜象モデルの2皮類であり、これらはそれぞれ抜象機械の公理的意味論ず挔算的意味論に盞圓する[2]。たた、蚈算耇雑床「コスト」を、時間蚈算操䜜ず空間倀の衚珟の䞡偎面から蚘述する著者もいる。実際には、抜象化が完党ではないため、倚くの䞀般的なデヌタ型はADTではなく、ナヌザは衚珟に起因する算術オヌバヌフロヌなどの問題に泚意しなければならない。䟋えば、敎数は固定幅の倀32ビットたたは64ビットの2進数ずしお栌玍されるこずが倚いため、最倧倀を超えるず敎数のオヌバヌフロヌが発生する。

https://en.wikipedia.org/wiki/Abstract_data_type

䟋えば敎数は抜象デヌタ型であり倀 ..., -2, -1, 0, 1, 2, ... ず加算枛算乗算陀算および倧なり小なりなどの挔算によっお定矩されコンピュヌタが敎数をどう衚珟するかずは関係なく敎数分割に泚意しお身近な数孊に埓っお振る舞わせるこずができたす。


いいなず思ったら応揎しよう

あたり垳簿
お願い臎したす