Я не уверен, что даже знаю, как задать этот вопрос. При реализации компилятора я хотел бы позволить клиенту указывать, скажем, сгибы на кортежи.Я предоставил способ каррирования и выгрузки функции, но только потому, что я написал двоичный оператор в Ocaml и сложил его в терминах и представлениях типов.Пользователь не может написать эту функцию.
В макропроцессоре пользователь может написать эту функцию, потому что кортежи являются списками.
Для каррированных функций пользователь может легко писать преобразователи, потому что терминявляется двоичным как в целевом языке, так и в представлении Ocaml термина и набора текста.
Но они не могут сделать это для кортежей.Вот еще один пример: пользователь легко определяет последовательный оператор функциональной композиции.Но пользователь не может определить параллельную композицию: двоичная версия:
f1: D1 -> C1, f2: D2-> C2 --> f1 * f2: D1 * D2 -> C1 * C2
легко записывается, но не может быть расширена до 3-х терминов: здесь сгиб будет вычислять
f1 * (f2 * f3)
вместо
f1 * f2 * f3
[изоморфный, но не равный]
Обобщение этого вопроса: «Как мне реализовать полиадический язык программирования», что здесь слишком много, чтобы спрашивать.Я попытался создать встроенный преобразователь:
curry: T1 * T2 * T3 ... -> T1 -> T2 -> ... uncurry: T1 -> T2 -> .. T1* T2 * T3
, поэтому пользователь может просто делать сгибы с помощью бинарного оператора:
uncurry (fold user_op (uncurry term))
, но это не является достаточно общим и не работает так хорошо ..:)
Полагаю, что эквивалентный вопрос для Haskell был бы следующим: поскольку Haskell не имеет n-арных произведений, n-арные конструкторы кортежей моделируются в библиотеке с n функциями, где каждый из них должен быть записан вручную.Это явно отстой.Как бы это исправить?
[Я имею в виду, что написать скрипт Python для генерации этих n функций до некоторого предела n тривиально, поэтому почему так сложно сделать это хорошо типизированным способом внутриязык?]