2010-12-22 6 views
4

나는 ocaml에 새로 온 사람입니다. 누군가가 "객관적인 caml을 사용한 응용 프로그램 개발"책의 94 페이지에있는 자료를 이해하는 데 도움이되는지 알아 주시면 감사하겠습니다.Ocaml의 필수 목록 이해하기

다음 단락의 의미를 파악하는 데 문제 :

(itl l)의 평가 imap의 마지막 반복에 있도록 (ihd l)의 평가하기 전에 자리를 차지하게 그냥 것을

이 목록에서 참조를 l 은 머리를 검사하기 전에 빈 목록이되었습니다. 우리가 어떤 결과를 얻을 수없는 경우에도 목록의 예는 확실히 이제부터는 빈 입니다

imap (function x ! x) 예는

Uncaught exception: Failure("hd") 

대신

- : string ilist = {c=["one"; "two"; "three"]} 

의 내가 생각 반환하는

else icons (f (ihd l)) (imap f (itl l))` 

icons("one") ((icons("two") ((icon("three")([])))) 가되어 책에

- : string ilist = {c=["one"; "two"; "three"]} 

답변

4

I에게 예를 반환 목록은 필수적 스타일로 구현되었습니다. itl 함수는 목록을 변경합니다. 즉 첫 번째 요소를 제거하여 목록을 변경합니다. itl에 대한 호출 이후 첫 번째 요소는 본질적으로 영원히 사라졌습니다. OCaml의에서

else icons (f (ihd l)) (imap f (itl l)) 

지정되지 않은 순서를 투기 :

까다로운 부분은 icons 인수는 성명에서 실행되는 순서입니다. 마지막으로 INRIA 컴파일러에서 마지막 인수를 먼저 검사 했으므로 (imap f (itl l))보다 먼저 실행되고(f (ihd l)) 앞에 나옵니다. 이것이 의미하는 바는 ihd이 실제로 호출 될 때 itl이 호출되어 l의 모든 요소를 ​​제거하기에 충분한 시간입니다.

예를 들어, 마지막 두 번째 호출 인 l은 단지 ["three"]입니다.

let f x y z = x + y + z 
f (print_int 1; 1) (print_int 2; 2) (print_int 3; 3) 

:이 코드를 실행 해보십시오 예를 들어

(* l = ["three"] *) 
let tail = (itl l) in (* tail = [], l = [] *) 
let head = (ihd l) in (* l = [], ihd raises an exception *) 
icons head (imap f tail) 

:

icons (f "three") (imap f []) 

그러나 우리가 처음 itl를 호출하는 경우의 일이 무엇인지 살펴 보자 : 당신은이 발생할 것이라고 생각 내 컴퓨터 (OCaml 3.12)에서이 출력을 얻었습니다 :

321- : int = 6 
+0

자세한 설명에 감사드립니다. – ocamlNewcomer