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