Тип рекурсивно-типизированных функций на Цейлоне

Есть ли способ добиться каких-то рекурсивно-типизированных функций на Цейлоне? Например, я могу определить комбинаторную логику на Цейлоне безопасным для типов способом, например, так:

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.

Можно ли реализовать желаемое поведение в текущей версии Цейлона? Или это определенно потребует одну или обе из вышеупомянутых функций отставания?

0 ответов