2017-10-22 2 views
4

OCaml에서 간단한 범위 함수를 구현하려고하는데 다른 arity 호출에 대해 어떻게 할 수 있는지 궁금합니다.OCaml에서 다중 배열 함수를 정의하는 올바른 방법은 무엇입니까?

let range_aux ~start ~stop ~step = 
    let rec aux start stop step acc = 
    match (start, stop, step, acc) with 
    | (start,stop,step,acc) when start = stop -> List.rev acc 
    | (start,stop,step,acc) -> aux (start + step) stop step (start :: acc) in 
    aux start stop step [] 

let range ~start ~stop ~step = range_aux ~start ~stop ~step 
let range ~stop ~step = range_aux ~start:0 ~stop ~step 
let range ~stop = range_aux ~start:0 ~stop ~step:1 

분명히 마지막 정의가 적용되지 않습니다. 여러 가지 자질 함수를 정의 할 수있는 방법이 있습니까?

+2

하지 마십시오. 선택적 인수 사용 –

답변

6

일반적으로 OCaml에는 함수 오버로딩이 존재하지 않습니다. 특정 사용 사례의 경우, 선택적 인수를 사용할 수있다 : ?(start=0) 명명 된 인수 start는 선택 사항이며 기본값은 0 것을 의미

let range ?(start=0) ?(step=1) stop = range_aux ~start ~step ~stop 
let a = range 2 
let b = range ~start:1 2 
let c = range ~start:1 ~step:2 5 

.

컴파일러에서 선택적 인수를 사용하는시기를 알기 위해 최소한 하나의 위치 인수가 필요하기 때문에 stop을 위치 지정 인수로 지정했습니다.

let range ?(start=0) ?(step=1) ~stop() = range_aux ~start ~step ~stop 
let a = range ~stop:2() 

추신 : 또 다른 가능성은 마지막 인자로 단위 인수를 추가 할 수 있었을 것이다 은 start > stop 또는 (stop - start) mod step ≠ 0 일 때 무한 재귀로 내려갑니다.