목록이 xs 있다고 가정합니다. 어떻게 ATS에서 루프의 다음과 같은 스타일을 작성하려면 어떻게해야합니까 :ATS의 주어진 목록에 루프를 작성하는 방법은 무엇입니까?
foreach x in xs do process(x)
목록이 xs 있다고 가정합니다. 어떻게 ATS에서 루프의 다음과 같은 스타일을 작성하려면 어떻게해야합니까 :ATS의 주어진 목록에 루프를 작성하는 방법은 무엇입니까?
foreach x in xs do process(x)
당신은 (또한 : 고전 ATS 스타일) 이전 DIY 스타일을 사용할 수 있습니다, 즉 꼬리 재귀 함수를 사용하여, 말을하는 것입니다. 다음 예는 다음과 같습니다
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]
당신은 내가 같은 ATSLIB 같은 라이브러리에서 제공하는 연결자 또는 템플릿 함수 중 어느 것도 귀하의 경우에 적합하지 않는 경우이 방법이 바람직하다고 생각 전체 코드 online
를 실행할 수 있습니다.
(a list0
-value 용) 연결자 기반 솔루션 : ATS에서
(xs).foreach()(lam x => process(x))
, foreach
순차적 탐색 어떤 형태 않는 많은 기능을 오버로드된다.
각 요소의 위치가 필요한 경우도 iforeach
있습니다 :
(xs).iforeach()(lam (i, x) => process(i, x))
이 하나가되지 않도록 할 필요가있는 가난한 솔루션입니다!
함수 프로그래밍 초보자는 종종 심볼을 오버로드하는 함수를 사용하여 순회를 나열합니다.
(length(xs)).foreach()(lam i => process(xs[i])) // O(n^2)-time
이 매우 비효율적이다 : 예를 들어, 다음 줄이 무엇을 어느 정도 수행하는 코드를보고 매우 일반적입니다. 루프 안에 list_get_at
을 호출하는 것은 거의 항상 나쁜 생각입니다!