Я вижу здесь несколько интересных дискуссий о статической и динамической типизации. Обычно я предпочитаю статическую типизацию из-за проверки типа компиляции, лучшего документированного кода и т. Д. Однако я согласен с тем, что они действительно загромождают код, например, так, как это делает Java.
Итак, я собираюсь начать создавать собственный язык функционального стиля, и вывод типов - одна из вещей, которую я хочу реализовать. Я понимаю, что это большая тема, и я не пытаюсь создать что-то, чего раньше не делали, просто базовые выводы ...
Какие-нибудь указатели на то, что нужно прочитать, что поможет мне в этом? Желательно что-то более прагматичное / практическое, а не более теоретические тексты по теории категорий / теории типов. Если бы там был текст обсуждения реализации со структурами данных / алгоритмами, это было бы просто замечательно.
Ответы:
Я нашел следующие ресурсы, полезные для понимания вывода типов в порядке возрастания сложности:
Однако, поскольку лучший способ обучения - это делать, я настоятельно рекомендую реализовать вывод типов для игрушечного функционального языка, выполнив домашнее задание по курсу языков программирования.
Я рекомендую эти две доступные домашние работы по машинному обучению, которые вы можете выполнить менее чем за день:
Эти задания взяты из более продвинутого курса:
Реализация MiniML
Полиморфные, экзистенциальные, рекурсивные типы (PDF)
Двунаправленная проверка типов (PDF)
Подтипы и объекты (PDF)
источник
К сожалению, большая часть литературы по этой теме очень плотная. Я тоже был на твоем месте. Впервые я познакомился с предметом из книги «Языки программирования: приложения и интерпретация».
http://www.plai.org/
Я попытаюсь резюмировать абстрактную идею, сопровождаемую деталями, которые я не сразу нашел очевидными. Во-первых, вывод типа можно рассматривать как создание, а затем решение ограничений. Чтобы сгенерировать ограничения, вы рекурсивно просматриваете синтаксическое дерево и генерируете одно или несколько ограничений для каждого узла. Например, если узел является
+
оператором, все операнды и результаты должны быть числами. Узел, который применяет функцию, имеет тот же тип, что и результат функции, и так далее.Для языка без него
let
вы можете вслепую решить указанные выше ограничения с помощью замены. Например:здесь, можно сказать , что условие , если заявление должно быть Boolean, и тип , если заявление является такой же , как тип ее
then
иelse
статей. Поскольку мы знаем числа1
и2
являются числами, путем подстановки мы узнаем, чтоif
утверждение является числом.Там, где все становится неприятно и что я какое-то время не мог понять, имеет дело с let:
Здесь мы связались
id
с функцией, которая возвращает все, что вы передали, иначе известную как функция идентификации. Проблема в том, что тип параметра функцииx
различается при каждом использованииid
. Второйid
- это функция типаa -> a
, гдеa
может быть что угодно. Первый тип(a -> a) -> (a -> a)
. Это известно как let-полиморфизм. Ключ в том, чтобы решать ограничения в определенном порядке: сначала решите ограничения для определенияid
. Это будетa -> a
. Затем свежие, отдельные копии типаid
могут быть подставлены в ограничения для каждогоid
используемого места, например,a2 -> a2
иa3 -> a3
.Это было нелегко объяснить в онлайн-ресурсах. Они будут упоминать алгоритм W или M, но не упомянут, как они работают с точки зрения решения ограничений, или почему он не препятствует let-полиморфизму: каждый из этих алгоритмов обеспечивает упорядочение решения ограничений.
Я нашел этот ресурс чрезвычайно полезным, чтобы связать алгоритмы W, M и общую концепцию создания и решения ограничений. Немного густо, но лучше многих:
http://www.cs.uu.nl/research/techreps/repo/CS-2002/2002-031.pdf
Есть и многие другие статьи:
http://people.cs.uu.nl/bastiaan/papers.html
Я надеюсь, что это поможет прояснить несколько темный мир.
источник
В дополнение к Хиндли Милнеру для функциональных языков существует еще один популярный подход к выводу типов для динамического языка
abstract interpretation
.Идея абстрактной интерпретации состоит в том, чтобы написать специальный интерпретатор для языка, вместо того, чтобы сохранять среду конкретных значений (1, false, closure), он работает с абстрактными значениями, также известными как типы (int, bool и т. Д.). Поскольку он интерпретирует программу на абстрактных значениях, поэтому он называется абстрактной интерпретацией.
Pysonar2 - это элегантная реализация абстрактной интерпретации для Python. Он используется Google для анализа проектов Python. В основном он используется
visitor pattern
для отправки оценочного вызова соответствующему узлу AST. Функция посетителяtransform
принимает,context
в каком текущем узле будет оцениваться, и возвращает тип текущего узла.источник
Типы и языки программирования Бенджамина К. Пирса
источник
Lambda the Ultimate, начиная здесь .
источник