Карри и дизайн компилятора
Это домашнее задание:
Объясните, какие преобразования тип подпрограммы претерпевает при частичной параметризации.
До сих пор я понимаю, карри. Но я не могу найти никаких ресурсов о том, как подобная функция реализуется компилятором в памяти. Могу ли я указать правильное направление, возможно, ключевые слова для поиска или ссылки на ресурсы, или, возможно, объяснение того, как компилятор генерирует таблицу типов и символов среди прочего, связанного с вопросом.
Благодарю.
2 ответа
Карринг - это преобразование n аргументных функций в n унарных функций:
Например, если у вас есть троичная функция f:: t1 x t2 x t3 -> t, вы можете представить эту функцию как
f1 :: t1 -> (t2 -> (t3 -> t))
Другими словами, f1 - это функция, которая принимает аргумент типа t1 и возвращает функцию типа f2.
f2 :: t2 -> (t3 -> t)
f2 - это функция, которая принимает аргумент типа t2 и возвращает функцию типа f3.
f3 :: t3 -> t
f3 - это функция, которая принимает аргумент типа t3 и возвращает тип t.
Например, если f(a,b,c) = a+b*c, тогда:
f3(C) == c1+c2*C where c1 and c2 are constant.
f2(B) == f3(C) where c1 is constant and c2 is replaced with B.
f1(A) == f2(B) where c1 is replaced with A.
В функциональных языках функции являются гражданами первого класса, поэтому обычно они используются в качестве возвращаемого типа.
Карринг похож на фиксацию параметра функции. Что вам действительно нужно изменить, так это прототип функции, которая называется.. если у вас есть, например, retn_type function(param1, param2)
и вы каррируете его по первому параметру, устанавливаете его на фиксированное значение и получаете новую функцию retn_type(param2)
это можно назвать и передать по-другому от оригинала.
На самом деле вы можете получить его в компиляторе разными способами или взломать, но суть его простоты в том, чтобы просто переопределить новую версию, которая связана с первой. Поэтому, когда вы звоните retn_type(param2)
Вы выполняете тот же код первой функции, предполагая, что параметр1 задан при помощи curryfication.