2017-10-26 11 views
2

나는 약간 혼란 스럽다. 그래서ocaml의 계속되는 합격 스타일

let rec sumlist lst = 
      match lst with 
      | [] -> 0 
      | (h::t) -> h + (sumlist t) 

계속 다음과 같은 기능을 가지고, 그것은 아직도 무엇을 c 수단에 혼란 스러워요하고 보는

+1

c는 함수입니다. 'cont_sumlist l (fun x -> x)'는 모든리스트 요소의 합을 반환합니다. –

답변

3

일반적인 대답은 이미 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 +)).

6

한 가지 방법은 무엇

let rec cont_sumlist lst c = 
match lst with 
| [] -> (c 0) 
| (h::t) -> cont_sumlist t (fun x -> c (h + x)) 

과 같이 쓸 수있다 연속 전달 스타일은 함수가 반환되지 않는 경우 코드 작성 방법을 상상하는 것입니다. 함수가 계산을 수행 한 후에 수행 할 작업을 지시하는 각 함수의 추가 매개 변수를 사용하여 작업을 계속 수행 할 수 있습니다. 즉, 전체 계산의 "연속"역할을하는 함수를 전달합니다.

코드는 정확히 이렇게 쓰여지고 c은 계속됩니다. 즉, 함수가 의도 한 계산을 수행 한 후에 다음에 수행 할 작업을 알려주는 호출자가 전달하는 함수입니다.

연속 통과 스타일은 완전히 일반적입니다. 즉, 모든 계산이이 방식으로 표현 될 수 있습니다. 사실, 일반적인 기능 코드에서 연속 통과 스타일로의 기계적 변형이 있습니다.