Functional programming Ceylon中递归类型函数的类型

Functional programming Ceylon中递归类型函数的类型,functional-programming,higher-order-functions,lambda-calculus,ceylon,combinatory-logic,Functional Programming,Higher Order Functions,Lambda Calculus,Ceylon,Combinatory Logic,有没有办法在锡兰实现某种递归类型的函数?例如,我可以用类型安全的方式在锡兰定义组合逻辑,如下所示: 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

有没有办法在锡兰实现某种递归类型的函数?例如,我可以用类型安全的方式在锡兰定义组合逻辑,如下所示:

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);
此代码按预期工作。然而,为了清晰、简洁,以及对其他问题的适用性,我希望能够只使用函数来实现这种行为。以如下(非工作)示例为例:

在函数别名版本中,Fi类型表示操作数和返回值可以无限组合的函数。注意,由于其递归性质,类型Fi、Fi(Fi)和Fi(Fi)(Fi)在功能上是等价的;他们中任何一个的消费者都知道,如果他们有一个函数,如果在一个Fi上调用,就会给他们另一个Fi

以下是我对锡兰目前支持的内容的理解:

  • 由于在编译期间被擦除,因此不支持递归别名
  • 我不知道当前有什么Ceylon特性可以用来递归地专门化可调用类型,或者以其他方式获得所需的无限链接
  • A得到了否定的回答。然而,那是两年半以前的事了,在Ceylon 1.2中实现了一些潜在的相关功能(如类型函数)之前,以及Gavin King编写的一篇关于新类型函数支持的文章
  • 在高阶泛型上存在一个新的问题
  • 还有一个关于允许可调用的自定义实现的问题
在当前版本的Ceylon中是否可以实现所需的行为?或者它肯定需要上述积压工作特性中的一个或两个

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);