У динамічно типізованій системі значення мають типи під час виконання, але змінних та функцій немає. У статично типізованій системі змінні та функції мають типи, відомі та перевірені під час компіляції. Напр. В Python xможе бути будь-що ; під час виконання, якщо це 1число, а якщо воно є "foo"- це рядок. Ви знаєте лише, який тип xбув під час виконання, і він міг бути різним щоразу, коли ви запускали програму. На такій мові, як Java, ви писали б, int xякби xце було число, і ви знали б у час компіляції, що xзавжди має бути an int.
"Явні" та "неявні" типи відносяться до систем статичного типу. Визначальною характеристикою статичної системи є те, що типи відомі під час компіляції, але не обов'язково, що їх потрібно виписати. У Java типи явні - їх потрібно виписати. Тож у Java метод може виглядати приблизно так:
public int foo(String bar, Object baz) { ... }
Ці типи відомі і під час компіляції (статичні), і виписані (явні). Однак є також мови, які не змушують вас писати тип. Вони можуть визначити тип функції від її тіла та спосіб його використання. Прикладом може бути OCaml, де ви можете написати щось на зразок:
let foo x = x + 1
Оскільки ви використовували +, OCaml може зрозуміти, що xповинно бути intвсе самостійно. Таким чином, тип foo( foo : int -> int) буде відомо під час компіляції, так само , як , наприклад Java. Це повністю статично. Однак, оскільки компілятор може зрозуміти, які типи повинні бути самостійно, вам не потрібно їх виписувати самостійно: вони неявні.
Коротше кажучи: система явного типу явна чи неявна - це властивість статичних систем. Це зовсім інше питання, ніж динамічна чи статична система типів.
Часто у вас є типові системи, які часом явні і часом неявні.
Наприклад, я вважаю, що C # дозволяє робити висновки типів за допомогою varключового слова. Таким чином, замість того, щоб писати int x = 10, ви можете написати, var x = 10і компілятор з'ясує, що xмає бути int. C ++ робить щось подібне з auto. Ці системи, як правило, явні, але мають певні умовиводи.
На зворотному боці є системи, які зазвичай неявні, але іноді змушують вас виписати підпис типу. Haskell - чудовий приклад. Більшу частину часу Haskell може зробити для вас типи. Однак іноді можна написати код, який є неоднозначним show . read, коли Haskell не може самостійно з'ясувати типи. У цьому випадку ви змушені буде чітко вказати тип showабо read. Крім того, деякі більш досконалі функції типової системи (наприклад, поліморфізм рангу-n) роблять висновок нерозбірливим - тобто це не гарантовано припиняється. Це означає, що код, що використовує цю функцію, часто потребує явного підпису типу.