В динамически типизированных языках я могу создать функцию, которая принимает функцию в качестве аргумента и возвращает функцию.
Например, функция memoize
в Clojure.
(def memoized-fn
(memoize any-function))
В этом примере memoize
не важно, на что ссылается функция any-function
и сколько аргументов она принимает*.
* На самом деле неважно, что передается, (memoize 10)
допустимо для Clojure, но тогда попытка использовать возвращаемое значение просто вызовет исключение.
В прошлой жизни я хотел создать что-то подобное на языке со статической типизацией, в моем случае я работал со Scala, а Scala имеет много FunctionN
типов (от 1 аргумента до 23, я полагаю), но без какой-либо связи между функциями появилось нельзя воспользоваться их функциональностью и создать единую общую функцию.
В итоге у меня было что-то вроде этого *
def m(fn: Function1[A,Z]) : Function1[A,Z]
def m(fn: Function2[A,B,Z]) : Function2[A,B,Z]
....
def m(fn: Function23[A,B,....,Z]) : (fn: Function23[A,B,....,Z])
(На самом деле, я остановился на Fn 4 или 5, потому что, хотя я и рад существованию Function23, я никогда не хочу использовать ее на самом деле.)
* Это также, вероятно, код псевдо-Scala, я давно его не писал.
Вернемся к сегодняшнему дню: я понимаю, что с зависимыми типами я могу создать функцию, которая принимает аргумент параметризованный со значением. Хорошо зарекомендовавшим себя примером для этого является функция, которая берет список любого вида и размера n и возвращает список того же размера n.
Я могу понять это с однородными списками (список вида A размера n), но я пока не знаю, возможно ли это с гетерогенными списками.
И исходя из этого я предполагаю, что смог бы создать функцию, которая принимает n аргументов одного типа. Что-то вроде:
def m(fn: Function[n,A]): Function[n,A]
Я предполагаю, что мой фактический вопрос: может ли зависимое значение влиять на количество типов гетерогенным образом?
Также обратите внимание: пожалуйста, рассматривайте примеры memoize и языки, используемые выше, только как примеры моей идеи, я не спрашиваю, как memoize на языке со статической типизацией, а скорее задаю вопрос более высокого уровня с кодом memo в качестве примера.
* Пожалуйста, извините меня за отсутствие лучшего словарного запаса в этом вопросе, я все еще изучаю многое из этого. Предложения по редактированию/улучшению также приветствуются.