唯一性类型

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;