Я думаю, что попытка связать вывод типа ML с чем-нибудь в C ++ с большей вероятностью приведет к путанице, чем к пониманию. В C ++ просто нет ничего похожего на вывод типов.
Единственная часть C ++, которая не делает типизацию явной, - это шаблоны, но (по большей части) они поддерживают общее программирование. Шаблон функции C ++, который вы дали, может в равной степени применяться к неограниченному набору типов - например, код, который вы используете NumType
в качестве параметра шаблона, но будет работать со строками. Одна программа может создать экземпляр вашего add
для добавления двух строк в одном месте и двух чисел в другом месте.
Вывод типа ML не предназначен для общего программирования. В C или C ++ вы явно определяете тип параметра, а затем компилятор проверяет, что все, что вы пытаетесь сделать с этим параметром, разрешено этим типом. ML переворачивает это: он смотрит на то, что вы делаете с параметром, и выясняет, что тип имеет , чтобы вы могли выполнять эти вещи. Если вы пытались делать вещи, которые противоречат друг другу, он скажет вам, что нет типа, который мог бы удовлетворить ограничения.
Это было бы довольно близко к невозможному в C или C ++, в основном из-за всех неявных преобразований типов, которые разрешены. Например, если у меня есть что-то вроде a + b
в ML, он может сразу заключить, что a
и b
должны быть целыми числами - но в C или C ++ они могут быть практически любой комбинацией целых, указателей или плавающих типы точек (с ограничением, что они не могут оба быть указателями) или используемые определенные типы, которые перегружают operator+
(например, std::string
). В ML поиск типов может быть экспоненциальным в худшем случае, но почти всегда довольно быстрым. В C ++ я бы оценил его как экспоненциальный гораздо чаще, и во многих случаях он, вероятно, будет недостаточно ограничен, поэтому данная функция может иметь любую из множества разных сигнатур.