Ceylon

时间:2017-10-31 04:58:34

标签: functional-programming higher-order-functions lambda-calculus ceylon combinatory-logic

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

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。

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

  • 由于在编译期间被删除,因此不支持递归别名。
  • 我不知道任何当前的Ceylon功能可用于递归地专门化Callable类型或以其他方式获得所需的无限链接。
  • possibly related question收到了否定回复。然而,那是两年半前,之前在Ceylon 1.2中实现了类型函数等一些可能相关的特性,以及Gavin King在新类型函数支持上编写的pair blogs
  • 高阶通用的github issue
  • 还有另一个github issue允许自定义Callable实现。

可以在当前版本的Ceylon中实现所需的行为吗?或者它肯定需要上述积压功能中的一个或两个?

0 个答案:

没有答案