형식 유추(F#)

이 항목에서는 F# 컴파일러가 값, 변수, 매개 변수 및 반환 값의 형식을 어떻게 유추하는지 설명합니다.

형식 유추 일반 사항

형식 유추라는 개념은 컴파일러를 통해 형식을 결정적으로 추론할 수 없는 경우가 아니면 F# 구문의 형식을 지정할 필요가 없다는 데서 출발합니다. 명시적 형식 정보를 생략한다고 해서 F#이 동적 형식의 언어라거나 F#의 값이 약한 형식이라는 의미가 아닙니다. F#은 정적 형식의 언어입니다. 즉, 컴파일러에서 컴파일을 진행하는 동안 각 구문의 정확한 형식을 추론합니다. 컴파일러에서 각 구문의 형식을 추론하는 데 필요한 정보가 충분하지 않으면 형식 정보를 추가로 제공해야 합니다. 일반적으로 이와 같은 추가 형식 정보는 코드에 명시적 형식 주석을 추가하여 제공합니다.

매개 변수 및 반환 형식 유추

매개 변수 목록에서 각 매개 변수의 형식을 지정할 필요는 없습니다. 그러나 F#은 정적 형식의 언어이므로 컴파일 타임에 모든 값과 식의 형식이 정해집니다. 형식을 명시적으로 지정하지 않은 경우에는 컴파일러에서 컨텍스트를 기반으로 형식을 유추합니다. 별도로 지정하지 않은 형식은 제네릭인 것으로 유추됩니다. 사용되는 모든 값을 충족하는 단일 형식을 유추할 수 없는 경우 등과 같이 코드에서 값을 사용하는 방식에 일관성이 없으면 컴파일러를 통해 오류가 보고됩니다.

함수의 반환 형식은 함수에 포함된 마지막 식의 형식에 의해 결정됩니다.

예를 들어 다음 코드에서 매개 변수 형식 a 및 b와 반환 형식은 모두 int인 것으로 유추됩니다. 리터럴 100이 int 형식이기 때문입니다.

let f a b = a + b + 100

리터럴을 변경하여 형식 유추를 조작할 수 있습니다. 접미사 u를 추가하여 100을 uint32로 만들면 a, b 및 반환 값의 형식이 uint32인 것으로 유추됩니다.

특정 형식에만 사용할 수 있는 함수와 메서드 같이 형식에 대한 암시적 제한 사항이 있는 다른 구문을 사용하여 형식 유추를 조작할 수도 있습니다.

또한 다음 예제에서와 같이 함수 또는 메서드 매개 변수나 식의 변수에 명시적 형식 주석을 적용할 수도 있습니다. 각기 다른 제약 조건 사이에 충돌이 있으면 오류가 발생합니다.

// Type annotations on a parameter. 
let addu1 (x : uint32) y =
    x + y

// Type annotations on an expression. 
let addu2 x y =
    (x : uint32) + y

모든 매개 변수 뒤에 형식 주석을 추가하여 함수의 반환 값을 명시적으로 지정할 수도 있습니다.

let addu1 x y : uint32 =
   x + y

매개 변수에 형식 주석을 유용하게 사용할 수 있는 대표적인 예로는 매개 변수가 개체 형식일 때 멤버를 사용하려는 경우를 들 수 있습니다.

let replace(str: string) =
    str.Replace("A", "a")

자동 일반화

함수 코드가 특정 형식의 매개 변수를 필요로 하지 않는 경우 컴파일러에서는 매개 변수가 제네릭인 것으로 간주합니다. 이를 자동 일반화라고 합니다. 자동 일반화는 제네릭 코드를 간결하게 작성하는 데 큰 도움이 될 수 있습니다.

예를 들어 다음 함수는 두 매개 변수를 그 형식에 상관없이 튜플로 결합합니다.

let makeTuple a b = (a, b)

해당 형식은 다음과 같이 유추됩니다.

'a -> 'b -> 'a * 'b

추가 정보

형식 유추는 F# 언어 사양에서 자세하게 설명합니다.

참고 항목

기타 리소스

자동 일반화(F#)