假设我有一个列表xs。如何在ATS中编写以下样式的循环:
foreach x in xs do process(x)
答案 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
几乎总是一个坏主意!