Функциональное программирование IV Типы
Мотивация •
Технические причины: — Оптимизация — Статические проверки корректности — Документирование — Модульность, абстракция и инкапсуляция
Реализации в языках • Нетипизированные: – BCPL, ISWIM, SASL • Динамическая типизация (run-time): – Lisp, Java. Script, Clojure , Erlang, Groovy, Lua, MATLAB, PHP, Prolog, Python, Ruby, Smalltalk, . . . • Статическая типизация (compile-time): – F#, Haskell, ML, OCaml, C, C++, C#, Java, D, Eiffel, Fortran, Go, Objective-C, Pascal, Scala, . . .
•
•
•
•
•
Church-style typing •
Задание •
Curry-style typing •
•
•
Type preservation •
•
•
Смысл: Исключение из контекста информации о типизации связанных переменных не помешает типизации выражения. Доказательство: По структурной индукции на t. Если t — const, тривиально.
•
•
•
•
•
Полиморфизм •
•
Let-полиморфизм •
•
•
•
Most general types (aka Principal types) •
•
•
•
•
Строгая нормализация • Это свойство называется строгой нормализацией и приводит к тому, что чистое простое типизированное лямбда-исчисление лишается полноты по Тьюрингу. Класс выразимых в нём ф-ций очень ограничен.
•
ML, OCaml, F# Чтобы создать на основе нашего представления о типизированном лямбдаисчислении язык программирования, мы предпримем следующие шаги: • Выберем порядок редукции: если наш выбор падёт на ленивые (call-by-need) вычисления, то мы придём к языкам, подобным Haskell, если мы выберем аппликативный порядок, мы выведем ML
•
•
• Для лёгкой манипуляции с данными введём механизм сопоставления с образцом (pattern matching) • Улучшим синтаксис, введя значимые отступы для разделения блоков кода. Таким образом, мы получим язык программирования, очень похожий на любой из языков семейства ML.
ML Family ML (1973) Caml (1985) Lazy ML (1980 s) SML (1990) Miranda (1985) OCaml (1996) Haskell (1990) F# (2002)
Дополнительные темы: • • Hindley-Milner and algorithm W Curry-Howard isomorphism Type classes Dependent and inductive types Existential and Abstract data types ATS Programming Language Lambda cube, Kinds