Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Part5.doc
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
202.75 Кб
Скачать

5.4 Типи даних

Використання типів змінних дає можливість генерувати більш ефективний код і більш ефективно використовувати пам’ять. Вони надають обмежений спосіб статичної перевірки програм. Багато помилок програмування приводять до невідповідності типів і, отже, можуть бути знайдені до запуску програми, на етапі її компіляції.

Модифікуємо лямбда-вирахування, щоб ввести у нього поняття типу. Основна ідея полягає у тому, щоб кожний лямбда-терм мав тип, і терм e1 можна застосувати до терма e2 у комбінації e1 e2, якщо типи правильно співвідносяться між собою, тобто e1 має тип функції σ → τ і e2 має тип σ. Результат має тип τ. Ця властивість називається сильною типізацією. Терм e2 повинен обов’язково мати тип σ, зведення типів не допускається.

Існують безтипові мови, як імперативні, так і функціональні. Інші мови є слаботипізованими, компілятор допускає деяку невідповідність у типах, і сам виконує відповідні перетворення. Є мови, які виконують перевірку типів динамічно, на етапі виконання програми, а не компіляції.

Будемо далі розглядати запис вигляду e:σ, як запис твердження “e має тип σ ”.

Ми припускаємо, що у нас є деякий набір базових типів, таких, як Bool або Integer. З них можна конструювати інші типи за допомогою конструкторів типу. Дамо індуктивне визначення множини TC типів, яку можна вивести з множини C базових типів:

; .

Наприклад, можливими типами можуть бути Integer, Bool→ Bool, (Integer→ Bool)→( Integer→ Bool). Далі ми розширимо нашу систему типів і введемо поняття типових змінних, які є засобом для реалізації поліморфізму.

З точки зору теорії існує два основних підходи до задання типів.

Перший підхід, який належить Черчу – явна типізація. Кожному виразу зіставляється єдиний тип. Для констант цей тип задається заздалегідь. Правила коректного формування типів мають вигляд:

, .

Інший підхід належить Каррі і являє собою неявну типізацію. При цьому підході вираз може мати або не мати тип, і якщо має, то цей тип може бути не єдиним. Цей підхід є більш перспективним.

У той самий час деякі формальні деталі типізації, за Каррі, є більш складними. Ми визначаємо поняття типу не само по собі, а стосовно контексту, тобто до скінченного набору припущень про типи змінних.

Ми будемо записувати

Γ e : σ,

щоб відзначити, що “у контексті Γ вираз e може мати тип σ. Будемо уживати запис e : σ, або просто e : σ, якщо припущення про тип приймається у порожньому контексті. Елементи контексту мають вигляд v : σ, тобто вони являють собою припущення про типи змінних, як правило, тих, які є компонентами виразів. Будемо припускати, що в Γ немає суперечливих припущень.

5.5 Типи і підтипи

Типи можна розглядати як частково визначені множини.

Кожному типові відповідає деяка множина значень. Можна ввести універсальну множину V, що містить значення всіх базових і похідних типів. Усякий тип даних є підмножиною множини V.

Виділення у типі деякого підтипу можна вважати уточненням, тому що це зв'язано з уточненням множини елементів. Уточнення можна розумітити як розширення наших знань про елементи типу даних. Якщо про елементи немає ніяких знань, його можна вважати елементом простору V.

Типи являють собою частковий порядок за включенням і утворюють решітку. Найбільший елемент – V, найменший - .

Нехай тип σ є підтипом типу τ (позначається σ ≤ τ).

У цьому разі об'єкт типу σ є також і об'єктом типу τ і, отже, може використовуватися скрізь, де використовується об'єкт типу τ.

Аналогом в ієрархічній структурі строгого спадкування може бути відношення ISA – “є одним з”. Наприклад: “student ISA person” означає, що тип student є підтипом person.

Існують правила утворення підтипів (правила уточнення).

Правило для діапазону, де τ=n .. m – тип, σ=n'.. m' – підтип:

Правило для функції, де σ → τ – тип функції f ; σ'→ τ' – тип функції f ', який є підтипом функції f:

.

Правило для запису, де τi, σi – тип і підтип i-го поля запису:

.

Правило для запису з варіантами, де τi, σi – тип і підтип i-го поля запису; – операція “або”:

.

Приклади типів і підтипів:

3 .. 5 ≤ 2 .. 6 – для діапазонів;

(8 .. 12 → 3 .. 5) ≤ (9.. 11 → 2 .. 6) – для функцій з областями визначення і значень, що є діапазонами;

(Nat → Nat) не є підтипом (Integer → Integer) - для функцій, де Nat – тип натуральних чисел; Integer – тип цілих чисел;

{length: Integer, breadth: Integer } ≤ {length: Integer } – для записів;

[a: Integer b: Bool] ≤ [a: Integer b: Bool c: Char] - для записів з варіантами. Тип праворуч є більш невизначеним, ніж тип ліворуч.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]