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