Добре, ходімо по черзі.
Цінності
Цінності - це конкретні дані, які програми оцінюють та жонглюють. Нічого фантазійного, деякі приклади можуть бути
1
true
"fizz buzz foo bar"
Типи
Гарний опис для типу - це "класифікатор для значення". Тип - це трохи інформації про те, яке значення буде під час виконання, але вказане під час компіляції.
Наприклад, якщо ви скажете мені це e : bool
під час компіляції, і я знаю, що e
це true
або false
під час виконання, нічого іншого! Оскільки типи класифікують такі величини, як це, ми можемо використовувати цю інформацію для визначення деяких основних властивостей вашої програми.
Наприклад, якщо я коли - небудь ви додавати e
і e'
коли e : int
і e' : String
, то я знаю , що - то відкусив! Насправді я можу позначити це і видавати помилку під час компіляції, кажучи: "Ей, це зовсім не має сенсу!".
Більш потужна система типу дозволяє отримати більш цікаві типи, які класифікують більш цікаві значення. Наприклад, розглянемо деяку функцію
f = fun x -> x
Це досить зрозуміло f : Something -> Something
, але що це повинно Something
бути? У системі нудного типу нам доведеться вказати щось довільне, наприклад Something = int
. У гнучкішій системі типу, можна сказати
f : forall a. a -> a
Тобто, "для будь-яких a
, f
відображає a
на a
". Це давайте скористаємося f
більш загально і пишемо цікавіші програми.
Більше того, компілятор перевірить, чи справді відповідає класифікатору, який ми йому дали, якщо f = fun x -> true
тоді у нас є помилка, і компілятор скаже так!
Так як tldr; type - обмеження у часі компіляції на значення, якими може бути вираз під час виконання.
Тип Конструктор
Деякі типи споріднені. Наприклад, список цілих чисел дуже схожий на список рядків. Це майже так, як sort
для цілих чисел майже як sort
для рядків. Ми можемо уявити собі якусь фабрику, яка будує ці майже однакові типи, узагальнюючи їхні відмінності та будуючи їх на вимогу. Ось що таке конструктор типів. Це як би функція від типів до типів, але трохи обмежена.
Класичний приклад - це загальний список. Конструктор типу для - це просто загальне визначення
data List a = Cons a (List a) | Nil
Тепер List
це функція, яка відображає тип a
до списку значень цього типу! У Java-land я думаю, що це, можливо, називають "загальними класами"
Тип параметрів
Параметр типу - це просто тип, переданий конструктору типу (або функції). Так само, як і на рівні значення, ми би сказали, foo(a)
має параметр, a
як List a
і параметр типу a
.
Види
Види трохи хитрі. Основна ідея полягає в тому, що певні типи схожі. Наприклад, у нас є всі примітивні типи в Java int
, char
, float
... , які все поводяться так , як ніби вони мають один і той же «тип». За винятком випадків, коли ми говоримо про класифікатори для самих типів, ми називаємо види класифікаторів. Отже int : Prim
, String : Box
, List : Boxed -> Boxed
.
Ця система дає приємні конкретні правила щодо того, які типи ми можемо використовувати де, як і те, як типи регулюють значення. Очевидно, це було б дурницею
List<List>
або
List<int>
У Java так List
потрібно застосовувати конкретний тип, щоб використовувати його так! Якщо ми подивимось на їхні види List : Boxed -> Boxed
та з тих пір Boxed -> Boxed /= Boxed
, вищесказане - це своєрідна помилка!
Більшу частину часу ми насправді не думаємо про види, а просто ставимось до них як до "здорового глузду", але із системами більш вигадливого типу щось важливе думати.
Маленька ілюстрація того, що я говорив до цього часу
value : type : kind : ...
true : bool : Prim : ...
new F() : Foo : Boxed : ...
Краще для читання, ніж Вікіпедія
Якщо вас цікавлять подібні речі, я дуже рекомендую вкласти хороший підручник. Теорія типів і PLT взагалі досить велика і без цілісної бази знань ви (або, принаймні, я) можете блукати, не дістаючи нікуди місяцями.
Дві мої улюблені книги - це
- Типи та мова програмування - Бен Пірс
- Практичні основи мов програмування - Боб Гарпер
Обидві це чудові книги, які представляють те, про що я тільки говорив, і багато іншого в красивих, добре пояснених деталях.