2012-05-08 1 views
5

OCaml은 오버로딩을 지원하지 않는다는 것을 알고 있습니다. 그런 다음 과부하가 발생하지 않도록이 작업을 수행하기 위해 우리가 할 수있는 일은 무엇입니까?Ocaml에서 오버로딩

1) 대신 다형성을 사용 하시겠습니까? 2) 다른 기능에 다른 이름을 지정 하시겠습니까? 3) 서로 다른 모듈에 같은 이름의 함수를 넣으시겠습니까?

어느 것이 작동할까요?

답변

13

모두 오버로드가 무슨 뜻인지에 달려 있습니다. 다음과 같은 몇 가지 사용 사례가 있습니다.

정수가 아닌 다른 값을 조작하는 수학 표현식에서 일반적인 삽입 연산자 이름을 사용하려는 경우 : 연산자를 로컬로 리 바인드하십시오. 모듈 및 "로컬 열기"가 도움이 될 수 있습니다.

module I32 = struct 
    open Int32 
    let (+), (-), (*), (/), (!!) = add, sub, mul, div, of_int 
end 

... I32.(x + y * !!2) ... 

사용중인 숫자 형식 유형에서 연산을 다형성으로 만들려면 해당 숫자 연산자를 추상화해야합니다. 예 (정수로) 일반 고속 지수 함수의 경우, 그는 당신의 세트로의 "과부하"에 원하는 것을 캡처하는 등 행렬보다 일반적으로

let rec pow (*) one a = function 
    | 0 -> one 
    | n -> pow (*) (if n mod 2 = 0 then one else one * a) (a * a) (n/2) 

let() = assert (pow (*.) 1. 2. 3 = 8.) 

, 그래, 아이디어가 사용할 수 있습니다 연산자 (여기에 중절 연산자는 있지만 일반 이름은 잘 읽고 가독성을 향상시키는 경우가 많음)를 사용하고 하스켈 유형 클래스가 컴파일되는 것과 마찬가지로 사실을 사전에 전달하고 추상화합니다.

+0

모듈 I32에서 'Int32를 연다'는 것을 알았습니다. 대신 'Int32 포함'을했다면 어떻게 될까요? 그 맥락에서 본질적으로 동등한가? – aneccodeal

+1

@aneccodeal : 이것은 매우 다를 것입니다 :'include'를 사용하면이 'I32'는 모든 Int32를 포함하므로'I32'를 로컬로 열면 특히 Int32의 모든 정의를 가져옵니다. 나는 사용자 정의를 섀도 잉하는 위험에 빠지기 때문에 큰 범위를 '열지 않는'것을 선호한다. – gasche