2017-12-06 17 views
0

OCaml의 BST에 대한 기본 작업을 위해 모듈/인터페이스를 만들려고합니다. (언어가 어떻게 새로워 졌는지 정확히 알지 못합니다.) 내 목표는 다음과 같은 일을하게 해주는 구현을하는 것이다.모듈을 사용하는 BST - OCaml

T.create();; 
T.push(2);; 
T.push(3);; 
T.push(5);; 

2,3,5로 구성된 BST 트리를 얻으려면. 나는 이런 식으로 할 필요가 내가 확인하고 때/내 코드를 사용 그래서

let teeBst = T.push(2)(T.push(3)(T.push(5)(T.create())));; 

:

그러나 순간

내가 이런 식으로 뭔가를 작성해야이 달성

let tee2 = T.push(2)(T.push(3)(T.push(5)(T.create())));; 
    T.postorder(tee2);; 

출력은 괜찮습니다 :

# val tee2 : T.bt = <abstr> 
# - : int list = [2; 3; 5] 

그러나 이전에 말씀 드렸듯이 다음과 같이 수행하고 싶습니다.

T.push(2);; 
T.push(3);; 
T.push(5);; 
T.postorder();; 

아래 내 구현 (I이 몇 가지 내 postorder 기능을 변경하지만 현재 사용하고있는 사람이 일시적인 그래서 내가 기압이 트리를 확인하실 수 있습니다를 필요로 실현). 해결책을 보면 제게 알려주세요.)

답변

1

모듈을 클래스로 만들려는 것처럼 보이지만 더 관용적 인 솔루션을 고려해보십시오. 배관 운영자를 고려해 보셨습니까?

T.create() 
|> T.push(2) 
|> T.push(3) 
|> T.push(5) 
|> T.postorder;; 

또는 (당신은 물론 단지 T보다 더 긴 이름의 모듈이있는 경우 더 의미) 지역의 개방과

당신도 할 수

T.(
    create() 
    |> push(2) 
    |> push(3) 
    |> push(5) 
    |> postorder 
); 

당신이 필요로 요구하고 글로벌 변경 가능 상태를 도입하는데, 이는 단순히 "변화"만 아니라 완전히 다른 패러다임이다. 그리고 일반적으로 눈살을 찌푸린 이유는 코드를 예측할 수 없게 만들고 디버깅하기가 어렵 기 때문입니다. 왜냐하면 어느 시점에서든 언제든지 바뀔 수있는 상태에 의존하기 때문입니다.

또 다른 가능성은 실제로 클래스를 사용하는 것입니다. 왜냐하면 OCaml도 클래스를 사용하기 때문입니다. 그렇다면 당신은 아직도 변할 수있는 상태가 될 것이지만 적어도 포함될 것입니다.

+0

고맙습니다! 파이프 운영자가 내가 찾는 곳이었습니다. 하지만 이제는 포스트 오더 기능에 문제가 있습니다. 이 함수를 "unit-> int list"로 만들 수 있습니까? "bt -> int list"를 사용할 수 없기 때문에 찾을 수없는 것 같습니다.> T.postorder() – hdw3

+1

사용중인 함수 응용 프로그램 구문이 오해의 소지가 있습니다. OCaml은 함수 응용에 괄호를 사용하지 않으며, 단일 인수로 작동하는 이유는 순전히 부수적 인 것입니다. 적절한 구문은'T.create() |> T.push 2 |> T.postorder'입니다. 단일 룰을 괄호로 묶고 함수와 괄호로 묶인 인수 사이의 공백을 제거 할 수 있지만 혼동하지 않는 것이 목적입니다. – glennsl