2013-02-01 3 views
2

방금 ​​F # 및 함수 프로그래밍으로 시작했습니다. 첫 번째 값이 표준 int 대신 문자열이어야한다는 것을 정의하는 튜플을 함수로 만들 수있는 방법을 알고 싶습니다.함수의 튜플에서 형식을 정의하는 방법

예 :

문자열, s, n 시간을 복제하고 그것을 반환하는 함수입니다. 이 작품

let rec pow2 = function 
    | (s:string,0) -> "" 
    | (s:string,n) -> s + pow2(s,n-1) 

,하지만 난 s:string 모든 경우를 정의하는 것보다 더 나은 방법이 있다고 생각 : 내가 지금있는 것은 이것이다.

는 사실, 어떤 유형 약어가 여기에 필요하지 않습니다

답변

7

(나는 String.replicate을 알고,이는 효과를 위하여, 그러나 학습하지 않습니다). 하여 첫 번째 패턴 일치의 "" 반환 값은 컴파일러에 대한 충분한 충분한 힌트 :

> let rec pow2 = function 
    | (s,0) -> "" 
    | (s,n) -> s + pow2(s,n-1);; 

val pow2 : string * int -> string 
4

당신은 첫 번째 경우에 유형 약어 필요 -은 F # 컴파일러가 추론 할 수 있다는 튜플의 첫 번째 요소 나머지 경우에는 string이어야합니다.

let rec pow2 = function 
    | (s:string,0) -> "" 
    | (s,n) -> s + pow2(s,n-1) 

그것은 스타일의 문제입니다,하지만 난 당신이 이런 식으로 함수를 작성하는 경우 읽기 좀 더 쉽게 생각 :

let rec pow2 (s, n) = 
    match n with 
    | 0 -> "" 
    | _ -> s + pow2(s, n-1) 
4

을 또한, 다음과 같이 그것을 할 수있는 유형 튜플은 함수 정의에 나와있다 : 튜플의 요소가 명시 적 유형 약어에 *로 구분된다

let rec pow2 ((s, n) : string * int) = 
    match n with 
    | 0 -> "" 
    | _ -> s + pow2 (s, n - 1) 

참고. 또한 Stephen이 지적한 것처럼 유형 추론 시스템은 n을 정수와 일치시키고 문자열 ("")을 s에 추가하기 때문에 유형 추론 시스템은 튜플 유형을 파악할만큼 똑똑 할 것입니다.

관련 문제