2017-03-06 8 views
0

어떻게하면 lseq 함수를 호출하여 영원히 작동 할 수 있는지 이해할 수 없습니다. 내가ocaml에서 느린 평가

lseq 5 

를 호출하는 경우

type 'a llist = LazyList of 'a * (unit -> 'a llist) 
let rec lseq nr = 
    LazyList (nr, fun() -> lseq (nr+1)) 

나는

int llist = LazyList (5, <fun>) 
+0

"너는 영원히 뛰지 않니?" 아니면, "lseq"함수 호출이 끝나는 이유는 무엇입니까? 그게 네가 묻고 싶은거야? – ivg

+0

글쎄, 만약 내가 lseq 5 전화 int llist = LazyList (5, ) 그만하지 않았습니까? – Oleg

답변

0

lseq를 호출 할 때마다 유형 'a llist의 새 값을 구성합니다 얻을. 값은 두 부분으로 구성됩니다. 첫 번째 부분은이 단계에서 생성 된 목록 요소이며 두 번째 부분은 나머지 목록을 생성하는 함수입니다. 그러면 함수가 아직 호출되지 않으므로 함수가 순환하지 않습니다.

평신도 용어로, 목록은 하나의 값을 가진 쌍이고 전화 번호는 나머지를 얻기 위해 전화해야합니다. 당신이 더 많은 값을 필요로한다면, 당신은이 기능을 종료하지 않습니다와 숫자의 무한 시퀀스를 출력 할 것이다, 물론

let rec print_lseq (LazyList (x,next)) = 
    print_int x; 
    print_lseq (next()) 

, 예를 들어, 더 호출해야합니다.

예제와 관련하여 lseq 5은 다음과 같이 보이는 무한 시퀀스입니다 : 5, 6, 7, .... 열심히 메모리에 구축되는 것이 아니라 대신 레서피와 같으며 시퀀스를 생성하는 방법과 같습니다.

+0

간단하고 명확한 설명에 감사드립니다. – Oleg