你能为元组类型起别名吗?

Can you alias a tuple type?

我正在研究 Ceylon,我正在尝试为元组创建别名。以下不起作用:

class MyPair(Integer i, Float f) => [i, f];
class MyPair(Integer i, Float f) => [Integer, Float](i, f);
class MyPair(Integer i, Float f) => 
        Tuple<Integer|Float, Integer, Tuple<Float, Float, Empty>>(i, [f]);
class MyPair(Integer i, Float f) => 
        Tuple<Integer|Float, Integer, Tuple<Integer|Float, Float, Empty>>(i, [f]);
class MyPair(Integer i, Float f) => 
        Tuple<Integer|Float,Integer,Tuple<Float,Float,Empty>>(i, Tuple<Float,Float,Empty>(f, []));

前两个错误与括号的使用有关:

Incorrect syntax: missing statement-ending ; at [ expecting statement-ending ;

第二个有两个单独的错误:

的一些变化
Alias parameter distance must be assignable to corresponding class parameter rest: Integer is not assignable to [Integer]

class MyPair

Argument must be a parameter reference to distance

f[f] 或元组构造上。

有办法吗?

经过一番修改后我发现了

class MyPair(Integer i, [Float] f) => 
        Tuple<Integer|Float, Integer, Tuple<Float, Float, Empty>>(i, f);

有效。

不能比你的解决方案做得更好,但你至少可以使用 Rest 类型参数的快捷方式:

class Pair([Integer i, [Float] f]) => Tuple<Integer|Float, Integer, <b>[Float]</b>>(i, f);

您在此处受到限制,因为您的 class 别名的参数类型必须与您作为别名的 class 的参数类型匹配。如果我正确解释 spec

Note: currently the compiler imposes a restriction that the callable type of the aliased class must be assignable to the callable type of the class alias. This restriction will be removed in future.

那么这可能会在后续版本中起作用:

class Pair(Integer i, Float f) => Tuple<Integer|Float, Integer, [Float]>(i, [f]);

可能甚至:

class Pair(Integer i, Float f) => [i, f];

然后,如果您的目标是 destructure 一个元组,Ceylon 1.2 将允许您直接这样做:

value [i, f] = [2, 0.5];

是的,class 别名声明中 => 的 RHS 上的实例化表达式目前受到极大限制,不是设计使然,而是因为实现完整需要一些额外的工作支持编译器中的任意实例化表达式 backends.

但我现在实际要做的是使用常规类型 alias,像这样:

alias MyPair => [Integer,Float];

并像这样使用它:

MyPair pair = [1, 1.0];

我认为这实际上比使用 class 别名更干净。

HTH.