如何在ATS中的给定列表上编写循环?

时间:2016-10-24 16:45:38

标签: ats

假设我有一个列表xs。如何在ATS中编写以下样式的循环:

foreach x in xs do process(x)

3 个答案:

答案 0 :(得分:1)

你可以使用旧的DIY风格(也就是:经典的ATS风格),也就是说,使用尾递归函数。这是一个例子:

extern
fun
process (x: int): void
fun
loop {n:int} (xs: list(int, n)): void =
  case+ xs of
  | list_nil () => ()
  | list_cons (x, xs1) => let
    val () = process (x)
  in
    loop (xs1)
  end
// end of [loop]

您可以运行完整代码online

我认为如果ATSLIB等库中提供的组合器或模板函数都不适合您的情况,这种方法更可取。

答案 1 :(得分:0)

基于组合器的解决方案(对于list0 - 值):

(xs).foreach()(lam x => process(x))

在ATS中,foreach重载了许多执行某种形式的序列遍历的函数。

如果需要每个元素的位置,还有iforeach

(xs).iforeach()(lam (i, x) => process(i, x))

答案 2 :(得分:0)

这是一个需要避免的 POOR 解决方案!

函数式编程的初学者经常使用list_get_at函数(重载符号[])来列出遍历。例如,看到代码执行或多或少与以下行相关的代码是相当常见的:

(length(xs)).foreach()(lam i => process(xs[i])) // O(n^2)-time

这非常低效。在循环中调用list_get_at几乎总是一个坏主意!