教堂中的元组连接

Tsh*_*nga 6 hpc tuples concatenation addition chapel

假设我正在生成元组,我想在它们到来时将它们连接起来.我该怎么做呢?以下是元素添加:

如果ts = ("foo", "cat"),t = ("bar", "dog")

ts += tts = ("foobar", "catdog"),

但我真正想要的是ts = (("foo","cat"),("bar","dog")).

所以我想第一个问题是"Chapel是否支持元组连接?",然后"它是否有二元运算符/函数?",然后"如果没有,这是一个很好的方法吗?",最后"make如果你懂得更好的生活方式,我的生活会更轻松".

请按顺序解决问题.

我很感激帮助!!

Bra*_*rad 6

第一个问题是"Chapel是否支持元组连接?"

我认为这里的答案是"否",原因如下:(1)Chapel变量有一个静态类型,在其生命周期内不能改变,(2)元组的类型定义为其静态元素数以及每个元素的类型.因此,给你的变量ts

ts = ("foo", "cat")
Run Code Online (Sandbox Code Playgroud)

它的类型是2*string("一个2元组的字符串"),这将阻止它永远能够存储该值,(("foo","cat"),("bar","dog"))因为它的类型是2*(2*string)("2元组的2元组字符串").因此,虽然这两个元组具有相同数量的元素(2),但它们的元素类型("字符串"与"字符串的2元组")不同,因此类型不同(不兼容).

"它有二元运算符/函数吗?"

由于上述原因,没有.

然后"如果没有,这是一个很好的方法吗?"

我会想到一些事情,但根据您的具体情况,可能会有所帮助,也可能不会有所帮助.ts您可以创建一个元组元组的新元组,而不是尝试重新分配:

const ts2 = (ts, t);
Run Code Online (Sandbox Code Playgroud)

你甚至可以在一个例程中递归地执行此操作,但如果元组增长到任何显着长度,这可能会最终炸毁你的代码大小(因为每次调用该函数都会生成一个不同类型的元组和它的唯一代码).

从我在你的问题中看到的,我想你可能想要使用元组列表或元组的一维数组(向量).这是一个基于列表的方法:

use List;

var listOfTups: list(2*string);

listOfTups.append(("foo", "cat"));
listOfTups.append(("bar", "dog"));

writeln(listOfTups);
Run Code Online (Sandbox Code Playgroud)

这是基于数组的方法:

var arrOfTups: [1..0] 2*string;

arrOfTups.push_back(("foo", "cat"));
arrOfTups.push_back(("bar", "dog"));

writeln(arrOfTups);
Run Code Online (Sandbox Code Playgroud)

在这两个中,我会推荐基于数组的方法,因为数组在Chapel中更加一流且功能强大(它们享有语法支持,允许数据并行,支持标量函数和运算符的推广等),而列表只是一个便利图书馆.

最后,"如果你懂得更好的生活方式,那就让我的生活更轻松".

我能想到的另一个相关的事情是,如果你不知道它,那么Chapel中的"varargs"函数会有效地将这些参数转换为元组.所以给出:

proc myFunc(x...) {
  writeln(x.type:string);
}

myFunc(("foo", "cat"), ("bar", "dog"));
Run Code Online (Sandbox Code Playgroud)

输出是:

2*2*string
Run Code Online (Sandbox Code Playgroud)