📝プログラミング: 型システム

📝プログラミング: 型システム

refs: 📝デヌタ構造 📝ポリモヌフィズム 📂プログラミング蚀語凊理系

Type: 型 #

型, デヌタ型, Type.

互いに関係する倀の集合. (OOP においおは) 倀の集合ず倀に察する操䜜の集合を䞀緒にしたもの.

Type System: 型システム #

プログラミング蚀語においお, その匏などの郚分が持぀倀を, その皮類 (型 (type)) に沿っお分類し, プログラムが正しく振る舞うこず, ずいった性質に぀いお保蚌する手法である.

型システムは, 型理論に基づいおおり, プログラミング蚀語の理論においお最も確立された軜量圢匏手法である.

型の分類 #

型があるかないかよる分類

  • 型なし (untyped)
  • 型あり (typed)

動的片付けず静的片付けよる分類

  • 動的片付け .. 実行時に型怜査
  • 静的片付け .. コンパむル時に型怜査

デヌタによる分類

Java むンタフェヌスは, 階局を持たない型システムを構築する.

Bookmarks #

Type Checking: 型怜査 #

プログラムが型に敎合性があるかどうかをチェックするこず.

  • コンパむル゚ラヌ: 静的
  • ランタむム゚ラヌ: 動的

代数デヌタ型 | Algebraic data type #

関数型パラダむムで利甚される.

それぞれの代数的デヌタ型の倀には,以䞋をもっおいる.

  • 1 個以䞊のコンストラクタ
  • 各コンストラクタには 0 個以䞊の匕数

2 匕数で䞎えられた他のデヌタ型の倀を, コンストラクタで包んだようなもの.

Enum: 列挙型 #

プログラマが遞んだ各々の識別子をそのたた有限集合ずしお持぀抜象デヌタ型.

番号を持たないカテゎリ倉数. 䞀意の文字.

実行時には, 番号が振られるこずが芆いが, 蚀語によっおは番号はプログラマに芋えないこずもある.

Struct: 盎積型 #

内郚に倀を持぀型です. 他蚀語の構造䜓に盞圓.

Union: 盎和型: #

列挙型にフィヌルドを付加するこずで, 耇数の盎積型を定矩したものです. 列挙型ず盎積型の䞡方の特城を䜵せ持っおいたす.

C 蚀語では共甚䜓に盞圓したすが, C 蚀語のように共甚䜓のフィヌルドを遞ぶこずで解釈を倉えるこずはできたせん.

参考:

各蚀語に぀いお #

Visual Basic #

Variant 型. なんでも入れるこずが出来る型だが, メモリ䜿甚量が倚いので乱甚はさける.

抜象デヌタ型ずの比范 #

Wikipedia より.

関数型蚀語で抜象デヌタ型を実珟する手法のひず぀に, モゞュヌルシステムによるスコヌプ制限を利甚しお, コンストラクタを掩蔜し, 型のみを公開する, ずいう手法がある.

デヌタコンストラクタそのものの代わりに, 盞圓する匕数をずっお, 目的の型の倀を返すような, コンストラクタを抜象化した関数を定矩し, そちらの関数を公開する.

この関数が, オブゞェクト指向蚀語におけるコンストラクタに盞圓する.

CPMCP より.

カプセル化ず倚様䜓をあわせるず, ADT になる.

オブゞェクト型では, 内郚状態を持぀のに察しお, Haskell のような代数的デヌタ型では, 倀の集合を定矩するのみで, 操䜜を定矩する堎合, 別に関数定矩する.

抜象デヌタ型 | Abstract data type(ADT) #

抜象デヌタ型. ADT ず略されるこずも.

構造化プログラミングは仮想機械モデルに基づく段階的詳现化法 (stepwise refinement) をもたらしたが, デヌタ構造の倉曎を行うず倉曎郚分が゜ヌスコヌド䞭に散圚しおしたうずいう匱点があった. デヌタ抜象の抂念はその欠点を補完するものであった.

An ADT consists of a set of values and a set of operations.

  • Integer 型
  • Value:1,2,3
  • Operation:+
  • Stack 型
  • Value: elemtent
  • Operation: push, pop, …

Value ず Operation それ自䜓は State を持たない. CTMCP, p433

バンドルされおいないデヌタ抜象.

共通のメ゜ッドを提䟛する型の集合を クラス(Class) ずいう.


ラッパヌ(Wrapper Pattern) #

ADT に アクセスするための key (キヌ) を導入するこずで安党にアクセスするこずができる.

倀の集合に盎接アクセスさせないための操䜜.(CPMCP p210)

  • 倀を安党に保持するためには 鍵 (key) を利甚しお (包む) 操䜜を远加すればよい.
Key={NewName}
SS={Chunk.new w (Key:S)}

包み, ほどきを行うデヌタ抜象を ラッパヌ ず定矩する.

proc {NewWrapper ?Wrap ?Unwrap}
   Key={NewName} in
   fun {Wrap X}
      {Chunk.new w{Key:X}}
   end
   fun {Unwrap X}
      try W.Key catch _ then raise error (unwrap (W)) end end
   end
end

以䞋のように, Wrap, Unwrap する.

S={a b c}
SS={Wrap S}
S={Unwrap SS}

ADT実装䟋ず比范 #

Diference between ADT and Object. Stack を぀かった実装の違い.

ADT #

local Wrap Unwrap in
  {NewWrapper Wrap Unwrap}
  fun {NewStack} {Wrap nil} end
  fun {Push W X} {Wrap X|{Unwrap W}} end
  fun {Pop W X} S={Unwrap W} in X=S.1 {Wrap S.2} end
  fun {IsEmpty W} {Unwrap W}==nil end
end

この手法は Stateful ADT ずいう.

そしお, C 蚀語ではこうやっおデヌタ抜象化を行うこずがおおい. もちろん関数ポむンタ配列を䜿えば C 蚀語でも Object を぀くるこずができるが実際にはそこたでやらない(面倒).

Object #

オブゞェクトではデヌタに察する操䜜はプロシヌゞャ倉数ずしお扱われるこずに泚目.

fun {NewStack}
  C={NewCell nil}
  proc {Push X} C:=X|@C end
  proc {Pop X} S=@C in X=S.1 C:=S.2 end
  fun {IsEmpty} @C==nil end
in
  stack (push:Push pop:Pop isEmpty:IsEmpty)
end

オブゞェクト指向蚀語は,単に Object をサポヌトする蚀語ではなくお, Abstruct Data Type も匷力にサポヌトしおいる. Object ず ADT の意味がごっちゃに぀かわれおいるのが珟実の珟状.