如何在ATS中使用(或迭代)数组

时间:2018-04-08 12:07:48

标签: ats

假设我们将数组声明如下:

dataview myarray 
( a:t@ype (* element types *)
, addr (* location *)
, int (* size *)
) =
  | {l:addr}
    myarray_nil(a, l, 0)
  | {l:addr}{n:int}
    myarray_cons(a, l, n + 1) of (a@l, myarray(a, l + sizeof(a), n))

我想迭代这样一个数组。我尝试了以下方式:

fun
{a:t@ype}
myarray_map
{l: addr}{n: nat}
(pf: !myarray(a, l, n) | p0: ptr(l), f:a-<cloref1>a): void = let
    prval myarray_cons(pf1, pf2) = pf
    val elm = ptr_get<a>(pf1 | p0)
    val ()  = ptr_set<a>(pf1 | p0, f(elm))
    val p1  = ptr_succ<a>(p0)
in
  (pf:= myarray_cons(pf1, pf2); myarray_map(pf | p1, f))
end

问题是当我点击myarray_nil的情况时,prval变得无与伦比。

由于pf是线性资源,我无法做到

case+ pf of
| myarray_nil() =>
| myarray_cons(pf1, pf2) =>

因为pf在这里消耗,但必须根据函数定义保留。我怎样才能以这种方式迭代myarray并确保pf在没有消耗的情况下完全匹配?

谢谢!

1 个答案:

答案 0 :(得分:0)

根据评论中给出的建议,我写了以下哪些typechecks:

fun
{a:t@ype}
myarray_map
{l: addr}{n: nat | n > 0}
(pf: !myarray(a, l, n) | p0: ptr(l), n: int(n), f:a-<cloref1>a): void = let
    prval myarray_cons(pf1, pf2) = pf
    val elm = ptr_get<a>(pf1 | p0)
    val ()  = ptr_set<a>(pf1 | p0, f(elm))
    val p1  = ptr_succ<a>(p0)
  in
    if n = 1
    then ()
    else myarray_map(pf2 | p1, n - 1, f); pf := myarray_cons(pf1, pf2)
  end