在 Rascal 中定义未知长度的元组数据类型
defining a tuple data type of unknown length in Rascal
我很想知道是否可以定义一种我们知道的数据类型,应该是一个元组,但目前其长度(或元素数量是不确定的)。申请如下:
//I want to declare a data type, one of whose argument is a tuple,
public data MyType=fromListCartesianProduct(tuple<?> product)
//Later I want to instantiate a MyType data by using taking List-CartesianProduct
//instantiate some MyType data
foreach(aTuple in [1,2,3]*["a","b"])
someArr[i]=fromListCartesianProduct(aTuple)
值得注意的是,在声明 "MyType" 时,aTuple 中的元素数量是不确定的。我还能在 rascal 脚本中声明这样的类型吗?
作为替代,我会将 MyType 声明为:
public data MyType=fromListCartesianProduct(list[] product)
并在构造特定实例之前将每个元组从取笛卡尔积转换为列表。出于清楚和其他原因,我想像以前那样定义 MyType。
原则上答案是否定的。元组具有固定长度,我们(还)没有行多态性。
话虽如此,数据构造器确实支持不同种类的多态性,这可能会有所帮助:
使用关键字参数的行多态性,您总是可以向数据类型添加更多关键字参数,如
data MyType = myCons(int j = 0); // initial decl
data MyType(int k = 1); // extension with another field
重载,你总是可以添加更多参数更多的构造函数
data MyType = f(int i); // initial declaration
data MyType = f(int i, int j); // overloaded declaration with more fields
您可以使用 Type
中的 make
函数根据参数列表动态构造此类构造函数。当然有 运行 时间类型异常的风险。
处理不可预知类型数据的另一种方法是在类型层次结构中上升一个级别(让它成为 value
),然后再次进行模式匹配:
list[value] myListRelationOfUnknownType = ...;
for (<int i, int j> <- myListRelationOfUnknownType)
println("printing only pairs of ints: <i> - <j>");
for (<int i, int j, int k> <- myListRelationOfUnknownType)
println("printing only the triples of ints: <i> - <j> - <k>");
这是一种更安全的静态方式。
我很想知道是否可以定义一种我们知道的数据类型,应该是一个元组,但目前其长度(或元素数量是不确定的)。申请如下:
//I want to declare a data type, one of whose argument is a tuple,
public data MyType=fromListCartesianProduct(tuple<?> product)
//Later I want to instantiate a MyType data by using taking List-CartesianProduct
//instantiate some MyType data
foreach(aTuple in [1,2,3]*["a","b"])
someArr[i]=fromListCartesianProduct(aTuple)
值得注意的是,在声明 "MyType" 时,aTuple 中的元素数量是不确定的。我还能在 rascal 脚本中声明这样的类型吗?
作为替代,我会将 MyType 声明为:
public data MyType=fromListCartesianProduct(list[] product)
并在构造特定实例之前将每个元组从取笛卡尔积转换为列表。出于清楚和其他原因,我想像以前那样定义 MyType。
原则上答案是否定的。元组具有固定长度,我们(还)没有行多态性。
话虽如此,数据构造器确实支持不同种类的多态性,这可能会有所帮助:
使用关键字参数的行多态性,您总是可以向数据类型添加更多关键字参数,如
data MyType = myCons(int j = 0); // initial decl data MyType(int k = 1); // extension with another field
重载,你总是可以添加更多参数更多的构造函数
data MyType = f(int i); // initial declaration data MyType = f(int i, int j); // overloaded declaration with more fields
您可以使用 Type
中的 make
函数根据参数列表动态构造此类构造函数。当然有 运行 时间类型异常的风险。
处理不可预知类型数据的另一种方法是在类型层次结构中上升一个级别(让它成为 value
),然后再次进行模式匹配:
list[value] myListRelationOfUnknownType = ...;
for (<int i, int j> <- myListRelationOfUnknownType)
println("printing only pairs of ints: <i> - <j>");
for (<int i, int j, int k> <- myListRelationOfUnknownType)
println("printing only the triples of ints: <i> - <j> - <k>");
这是一种更安全的静态方式。