Хабр Курсы для всех
РЕКЛАМА
Большая витрина: от крупнейших школ до частных авторов. Сравнивайте по цене, длительности, формату и выбирайте самый подходящий курс!
У меня вопрос по коду. Насколько я могу видеть, вы полагаетесь на то, что имена переменных уникальны и не учитываете, что имена аргументов вложенных лямбд могут затенять имена аргументов обрамляющих функций.
И этой действительно проблема. Скажем, если в окружение добавить факт, что имя "y" имеет тип "int", то для такого выражения:
(\x.x)(y)ваш алгоритм корректно выводит тип выражения, как int, но для чуть более сложного
(\y.y)(y)выводит неправильный Variable(TypeVariable(1)).
Реализуем Type Inference на Rust — Часть #2: Простой Lambda Calculus