나는 약간 혼란 스럽다. 그래서ocaml의 계속되는 합격 스타일
let rec sumlist lst =
match lst with
| [] -> 0
| (h::t) -> h + (sumlist t)
계속 다음과 같은 기능을 가지고, 그것은 아직도 무엇을 c
수단에 혼란 스러워요하고 보는
나는 약간 혼란 스럽다. 그래서ocaml의 계속되는 합격 스타일
let rec sumlist lst =
match lst with
| [] -> 0
| (h::t) -> h + (sumlist t)
계속 다음과 같은 기능을 가지고, 그것은 아직도 무엇을 c
수단에 혼란 스러워요하고 보는
일반적인 대답은 이미 0
(
[]
의 경우
우리 "반환"(즉, 공급) 0
우리가 제공하고 그 c
에, cont_sumlist
을 위해 특별히 감안할되지만, 빈 목록의 합)
(h::t)
의 경우 우리는 cont_sumlist t
에 대한 연속을 구성하므로 이후의 결과는 t
(즉, x
)가 준비되면 h
(h + x
에 의해)과 결합되어 (h::t)
에 대해 우리에게 제공된 c
에 추가로 공급됩니다.
이
따라서 식sumlist (h::t) = h + sumlist t
발현되지만 평가 체인은, 각각이 상기 연속 함수의 결과를 공급이 연속 함수의 체인으로
명시로한다; 스택 기반 평가 메커니즘에 함축되어 있지 않습니다. 우리는 목록
[h1; h2; h3; ...]
를 따라 가서, 계속이 점진적으로
c0 ∘ (h1 +) ∘ (h2 +) ∘ (h3 +) ∘ ...
로 건설되고 있으며, 목록이 완전히 통해 검색했을 때 마지막으로
0
호출되도록 즉
fun x -> c (h + x)
=
c ∘ (h +)
에서
; 여기서 c0
은 사용자가 최상위 통화 (예 :cont_sumlist [x; y; z; ... ; n] c
cont_sumlist [1,2] (fun x -> x)
=
(fun x -> (fun x -> (fun x -> x) (1 + x)) (2 + x)) 0
=
(fun x -> x)
(fun x -> (1 + x))
(fun x -> (2 + x)) 0
=
(1 + (2 + 0))
그래서 전체 권선 및 참여 풀어서 합은 C 형 의사로 지정된 바로 오른쪽에서 왼쪽으로 계산에는 스택 없다 것이 중요한 차이점
(c ∘ (x +) ∘ (y +) ∘ (z +) ∘ ... ∘ (n +)) 0
=
c (x + (y + (z + .... + (n + 0) ....)))
변신 간단한 단계의 순서
r = 0;
r += n;
.......
r += z;
r += y;
r += x;
call c(r); // call c with r, without expecting c to return; like a jump
전체 연속의 구성은 스택 권취와 유사하다고 말할 수 있습니다. 그 응용은 전통적인 스택 기반 평가에서 스택의 풀기에 해당합니다.
CPS는 모든 함수 호출이 반환 될 것으로 기대하는 일반적인 C와 유사한 특수한 종류의 함수 호출 프로토콜을 정의합니다.
CPS 정의의 각 경우는 함수에 대해 작은 단계 의미 변환 규칙을 제공하는 것으로 해석 할 수 있습니다 ([] --> 0 ; (h::t) --> (h +)
).
한 가지 방법은 무엇
let rec cont_sumlist lst c =
match lst with
| [] -> (c 0)
| (h::t) -> cont_sumlist t (fun x -> c (h + x))
과 같이 쓸 수있다 연속 전달 스타일은 함수가 반환되지 않는 경우 코드 작성 방법을 상상하는 것입니다. 함수가 계산을 수행 한 후에 수행 할 작업을 지시하는 각 함수의 추가 매개 변수를 사용하여 작업을 계속 수행 할 수 있습니다. 즉, 전체 계산의 "연속"역할을하는 함수를 전달합니다.
코드는 정확히 이렇게 쓰여지고 c
은 계속됩니다. 즉, 함수가 의도 한 계산을 수행 한 후에 다음에 수행 할 작업을 알려주는 호출자가 전달하는 함수입니다.
연속 통과 스타일은 완전히 일반적입니다. 즉, 모든 계산이이 방식으로 표현 될 수 있습니다. 사실, 일반적인 기능 코드에서 연속 통과 스타일로의 기계적 변형이 있습니다.
c는 함수입니다. 'cont_sumlist l (fun x -> x)'는 모든리스트 요소의 합을 반환합니다. –