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编写的一篇关于新类型函数支持的文章
- 在高阶泛型上存在一个新的问题
- 还有一个关于允许可调用的自定义实现的问题
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);