如何在ATS中获取列表的一部分?

时间:2017-09-28 00:43:04

标签: 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是细分的长度。

1 个答案:

答案 0 :(得分:1)

我能够使用以下代码

来完成
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