Я немного подумал о гипотетической языковой функции, и мне интересно, есть ли у каких-нибудь языков что-то похожее, из которого я мог бы поучиться или которое могло бы обеспечить релевантные условия поиска.
Этодля языков довольно распространено, чтобы позволить типам быть специализированными с ограниченными параметрами типа, часто называемыми обобщениями. Например, Foo<Bar>
как тип.
Мне интересно, позволяют ли какие-либо языки параметризировать типы с определенными целочисленными значениями, такими как Foo<10>
. Простым примером варианта использования может быть массив фиксированной длины, который может статически проверяться средством проверки типов.
Меня особенно интересуют языки, которые могут разрешать базовые математические операции в системе типов. Этот псевдокод в стиле C # объединяет два массива фиксированной длины в третий массив фиксированной длины с известной длиной, который будет вычисляться и обрабатываться компилятором как константа.
FixedArray<Length1 + Length2> Concat<Length1, Length2>(FixedArray<Length1> a, FixedArray<Length2> b)
where Length1: Integer, >= 0
where Length2: Integer, >= 0
{}
Я знаю о TypeScript,который приближаетсяОн допускает константы как типы, поэтому Foo<10>
допустим. Однако я считаю, что система типов рассматривает их больше как перечисления или символы и не понимает их как математические значения. Существуют способы немного подделать это с помощью перегрузки.
Исследуйте ключевые слова и документы, обсуждающие подобные функции - даже если они не реализованы на языке - представляют интерес. Предпочтение отдается ресурсам, которые не предполагают глубокого знакомства с теорией типов, хотя я возьму что-нибудь.