2009-12-29 3 views
5

빈을 정의하는 방법을 알고 싶습니다! OCaml에서 Hashtbl 타입의 전역 변수? 초기 크기를 모르고 성능상의 이유로 초기 크기를 추측하고 싶지 않기 때문에 Hashtbl.create를 사용하고 싶지 않습니다.OCaml 빈 글로벌 변수

기본적으로이 Hashtbl 변수는 함수에서 실제 Hashtbl을 할당 한 다음이 변수를 다른 함수와 공유하므로 항상 인수로 전달하지 않으려 고합니다. 세계화.

감사합니다,

Spasski

답변

5

당신은 무엇을 요구하는 것이 가능하다. 해시 테이블 옵션에 전역 참조를 정의 할 수 있습니다 (이 옵션을 사용하면 나중에이 필드를 초기화하지 않아도됩니다). 정의는 다음과 같이 표시됩니다

let hashtable = ref None 

초기화가 될 것입니다 :

hashtable := Some (Hashtbl.create n) 

그것을 사용하려면, 당신은 또한 당신이 아직 초기화되지 않은 경우 어떻게해야하는지 설명해야합니다 :

match !hashtable with 
    | None -> assert false 
    | Some h -> frobnicate h 

실제로 초기화되지 않은 변수는 OCaml 철학에 위배되며 인생을 더 어렵게 만듭니다. 이 접근법을 사용하지 말 것을 강력히 권합니다. 내 두 가지 제안은 다음과 같습니다.

  • 예상 크기의 해시 테이블을 만들 때 발생하는 성능 손실을 확인합니다. 오버 헤드는 생각보다 훨씬 작을 수 있습니다.

  • 어디서나 해시 테이블을 전달하십시오. 그것은 하나의 인수로 옵션 참조보다 짧습니다 ...

  • 해시 테이블과 함수를 클래스에 넣으십시오. 예를 들어, 필요에 따라 OCaml의에서

6

를 Hashtable 성장, 그래서 당신은 처음 AG에 추측을 줄 수 있습니다 : 초기 수를 초과하지만 너무 원활하게 작동하지만

module A 

let hash = Hashtbl.create 123;; 

... 

let exceed_hash() = 
     for i = 1 to 555 do 
       Hashtbl.add hash i (string_of_int i) 
     done;; 

가이를 확인 자습서 더 많은 정보 http://www.ocaml-tutorial.org/hashtbl