Тип рекурсивно-типизированных функций на Цейлоне
Есть ли способ добиться каких-то рекурсивно-типизированных функций на Цейлоне? Например, я могу определить комбинаторную логику на Цейлоне безопасным для типов способом, например, так:
class Fi(shared Fi(Fi) o) { }
Fi veritas =
Fi((Fi t) =>
Fi((Fi f) =>
t));
Fi perfidas =
Fi((Fi t) =>
Fi((Fi f) =>
f));
Fi si =
Fi((Fi l) =>
Fi((Fi m) =>
Fi((Fi n) =>
l.o(m).o(n))));
print(si.o(veritas).o(veritas).o(perfidas) == veritas);
print(si.o(perfidas).o(veritas).o(perfidas) == perfidas);
print(si.o(veritas).o(perfidas).o(veritas) == perfidas);
print(si.o(perfidas).o(perfidas).o(veritas) == veritas);
Этот код работает как задумано. Однако, для ясности, краткости и применимости к другим проблемам, я хотел бы иметь возможность реализовать это поведение, используя только функции. Возьмите что-то вроде следующего (нерабочего) примера:
alias Fi => Fi(Fi);
Fi veritas(Fi t)(Fi f) => t;
Fi perfidas(Fi t)(Fi f) => f;
Fi si(Fi l)(Fi m)(Fi n) => l(m)(n);
print(si(veritas)(veritas)(perfidas) == veritas);
print(si(perfidas)(veritas)(perfidas) == perfidas);
print(si(veritas)(perfidas)(veritas) == perfidas);
print(si(perfidas)(perfidas)(veritas) == veritas);
В версии псевдонимов функций тип Fi представляет функции, операнды и возвращаемые значения которых могут быть составлены на неопределенный срок. Обратите внимание, что из-за их рекурсивного характера типы Fi, Fi(Fi) и Fi(Fi)(Fi) могут считаться функционально эквивалентными; Все, что знает потребитель любого из них, - это то, что если у него есть функция, которая, если она вызывается через Fi, даст им другой Fi.
Вот мое понимание того, что в настоящее время поддерживает Цейлон:
- Рекурсивные псевдонимы не поддерживаются из-за удаления во время компиляции.
- Я не знаю ни одной текущей функции Цейлона, которую можно было бы использовать для рекурсивной специализации типа Callable или иным образом получить необходимый вид бесконечной цепочки.
- Возможно связанный вопрос получил отрицательный ответ. Однако это было два с половиной года назад, до того, как в Ceylon 1.2 были реализованы некоторые потенциально связанные функции, такие как функции типов, и пара блогов, написанных Гэвином Кингом о поддержке новых функций типов.
- Существует проблема с github для генериков высшего порядка.
- Есть еще одна проблема с github, позволяющая создавать пользовательские реализации Callable.
Можно ли реализовать желаемое поведение в текущей версии Цейлона? Или это определенно потребует одну или обе из вышеупомянутых функций отставания?