如何在 ATS 中获取列表的一部分?
How can I get a segment of a list in ATS?
基本上,我需要的是以下类型的函数:
fun
{a:t@ype}
{n:int}
{i,j:nat | i+j <= n}
list_get_segment(list(a, n), int(i), int(j)): list(a, j)
其中 i
是段的起始索引,j
是段的长度。
我可以用下面的代码做到这一点
fun {a:t@ype} takefirst {n, j:nat | j <= n} (ls: list(a, n), j:int(j)): list(a, j) =
if j = 0
then
list_nil()
else
let
val+ list_cons(head,tail) = ls
in
list_cons(head,takefirst(tail, j-1))
end
fun {a:t@ype} list_get_segment {n, i, j:nat | i+j <= n} (ls: list(a, n), i:int(i), j:int(j)): list(a, j) =
if i = 0
then
takefirst(ls, j)
else
let
val+ list_cons(head,tail) = ls
in
list_get_segment(tail,i-1, j)
end
基本上,我需要的是以下类型的函数:
fun
{a:t@ype}
{n:int}
{i,j:nat | i+j <= n}
list_get_segment(list(a, n), int(i), int(j)): list(a, j)
其中 i
是段的起始索引,j
是段的长度。
我可以用下面的代码做到这一点
fun {a:t@ype} takefirst {n, j:nat | j <= n} (ls: list(a, n), j:int(j)): list(a, j) =
if j = 0
then
list_nil()
else
let
val+ list_cons(head,tail) = ls
in
list_cons(head,takefirst(tail, j-1))
end
fun {a:t@ype} list_get_segment {n, i, j:nat | i+j <= n} (ls: list(a, n), i:int(i), j:int(j)): list(a, j) =
if i = 0
then
takefirst(ls, j)
else
let
val+ list_cons(head,tail) = ls
in
list_get_segment(tail,i-1, j)
end