你可以别名一个元组类型?

时间:2015-08-12 07:34:15

标签: tuples alias ceylon

我正在玩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]或元组结构上。

有办法做到这一点吗?

3 个答案:

答案 0 :(得分:4)

是的,类别名声明中$ swipl --traditional Welcome to SWI-Prolog (Multi-threaded, 64 bits, Version 7.3.4) Copyright (c) 1990-2015 University of Amsterdam, VU Amsterdam SWI-Prolog comes with ABSOLUTELY NO WARRANTY. This is free software, and you are welcome to redistribute it under certain conditions. Please visit http://www.swi-prolog.org for details. For help, use ?- help(Topic). or ?- apropos(Word). ?- compile(cr). true. ?- cr_puzzle(P). P = ([9, 6, 2, 3, 3]+[6, 2, 5, 1, 3]=[1, 5, 8, 7, 4, 6]) ; false. 的RHS上的实例化表达式目前受到极大的限制,而不是设计,只是因为它需要一些额外的工作来实现对任意实例化表达式的完全支持。编译器后端

但我现在实际要做的是使用常规类型=>,如下所示:

alias

并像这样使用它:

alias MyPair => [Integer,Float];

我认为这实际上比使用MyPair pair = [1, 1.0]; 别名更清晰。

HTH。

答案 1 :(得分:2)

经过一段时间的修补后,我遇到了

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

有效。

答案 2 :(得分:2)

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

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

您在这里受到限制,因为您的类别名的参数类型必须与您正在别名的类的参数类型相匹配。如果我正确地解释spec

  

注意:目前,编译器强加了一个限制,即别名类的可调用类型必须可分配给类别名的可调用类型。 此限制将在以后删除。

然后这可能适用于后续版本:

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