Вывод типа реализован в C++
Существует ли реализация в C++ логического вывода типа стиля Дамаса-Хиндли-Милнера, предпочтительно с использованием современных методов C++?
3 ответа
Вот моя реализация вывода типа Хиндли-Милнера в C++ 11, основанная на коде Python Роберта Смолшира, коде Scala Эндрю Форреста, коде Perl Никиты Борисова и статье "Базовая проверка полиморфных типов" Карделли.
Это делает интенсивное использование boost::variant
а также boost::apply_visitor
,
Я подозреваю, что вам не повезет; Функциональные парни, которые пишут эти вещи, обычно не делают этого на C++! Большинство компиляторов, к которым вы могли обратиться, используются для компиляции (например, для OCaml или GHC).
Так что, если кто-то сделал Хиндли-Милнера как игрушечный проект, то, вероятно, его нет в сети; если он был частью компилятора, то вряд ли он будет в C++.
Возможные вещи, которые приходят на ум:
- Объятия для Хаскелла в Си; где-то там будут источники C, которые будут делать то, что вы хотите, и Haskell - хороший знакомый сахар. Не тот C++, который вы хотите.
- Я ничего не знаю о F#, но я думаю, что это HM, и если кто-то написал толстый функциональный компилятор на C++ с современными технологиями, то, возможно, это MS. Очевидно, закрытый источник, хотя.
У нас есть механизм вывода типов здесь ( https://github.com/ltcmelo/psychec). Наш подход реализован после алгоритма HM(X) Поттье и Реми, с отдельными этапами для генерации ограничений и правильного вывода типов. Генерация ограничений реализована в C++, но разрешение типов реализовано в Haskell (извините!). Алгоритм выводит типы для программ на Си, чтобы восстановить частично доступный код. Инструмент доступен в режиме онлайн: http://cuda.dcc.ufmg.br/psyche-c/. Вы вводите часть программы на C, и она создает объявления типов, достаточные для ее компиляции.
С Уважением,
Фернандо