Tsh*_*nga 6 hpc tuples concatenation addition chapel
假设我正在生成元组,我想在它们到来时将它们连接起来.我该怎么做呢?以下是元素添加:
如果ts = ("foo", "cat"),t = ("bar", "dog")
ts += t给ts = ("foobar", "catdog"),
但我真正想要的是ts = (("foo","cat"),("bar","dog")).
所以我想第一个问题是"Chapel是否支持元组连接?",然后"它是否有二元运算符/函数?",然后"如果没有,这是一个很好的方法吗?",最后"make如果你懂得更好的生活方式,我的生活会更轻松".
请按顺序解决问题.
我很感激帮助!!
第一个问题是"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)