唯一性类型
Felix有一个特殊类型的组合子 uniq 它用于指定其参数类型的值是独占的。它通常用于指针。
首先,让我们编写一个将varray字符转换为大写的过程:
proc toupper(x: varray[char]) {
for i in 0 ..< x.len.int
perform set(x,i,toupper(get(x,i)));
}
Varray是通过引用传递的,因此这将就地修改Varray。那么我们如何在函数中使用它呢?
fun upcase(x: varray[char]) {
var y = varray x; // copy
toupper y;
return y;
}
我们不能仅仅对参数x调用toupper并返回它,因为在Felix函数中不允许有副作用。
但考虑一下这个例子:
var upped = upcase$ varray("Hello World");
println$ upped.str;
这是低效的,因为 upcase 我们复制数组,修改拷贝并返回它,但是参数 x 则不再可访问,因此将对其进行垃圾回收。
在这种情况下,为什么不直接修改参数:
fun upcase(x: uniq varray[char]) {
toupper x,peek;
return x;
}
var upped = upcase$ box (varray("Hello World"));
println$ upped.str;