어떻게하면 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>)
어떻게하면 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>)
lseq
를 호출 할 때마다 유형 'a llist
의 새 값을 구성합니다 얻을. 값은 두 부분으로 구성됩니다. 첫 번째 부분은이 단계에서 생성 된 목록 요소이며 두 번째 부분은 나머지 목록을 생성하는 함수입니다. 그러면 함수가 아직 호출되지 않으므로 함수가 순환하지 않습니다.
평신도 용어로, 목록은 하나의 값을 가진 쌍이고 전화 번호는 나머지를 얻기 위해 전화해야합니다. 당신이 더 많은 값을 필요로한다면, 당신은이 기능을 종료하지 않습니다와 숫자의 무한 시퀀스를 출력 할 것이다, 물론
let rec print_lseq (LazyList (x,next)) =
print_int x;
print_lseq (next())
, 예를 들어, 더 호출해야합니다.
예제와 관련하여 lseq 5
은 다음과 같이 보이는 무한 시퀀스입니다 : 5, 6, 7, ...
. 열심히 메모리에 구축되는 것이 아니라 대신 레서피와 같으며 시퀀스를 생성하는 방법과 같습니다.
간단하고 명확한 설명에 감사드립니다. – Oleg
"너는 영원히 뛰지 않니?" 아니면, "lseq"함수 호출이 끝나는 이유는 무엇입니까? 그게 네가 묻고 싶은거야? – ivg
글쎄, 만약 내가 lseq 5 전화 int llist = LazyList (5,) 그만하지 않았습니까? –
Oleg