2

有没有办法在 Ceylon 中实现某种递归类型的函数?例如,我可以在 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 目前支持的内容的理解:

  • 由于在编译期间被擦除,因此不支持递归别名。
  • 我不知道当前有任何 Ceylon 功能可用于递归地专门化 Callable 类型或以其他方式获得所需的无限链接。
  • 一个可能相关的问题得到了否定的答复。然而,那是两年半前的事了,在 Ceylon 1.2 和 Gavin King 写的关于新类型函数支持的博客中实现了一些可能相关的特性(如类型函数)之前
  • 高阶泛型有一个github 问题。
  • 关于允许 Callable 的自定义实现还有另一个github 问题。

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

4

0 回答 0