다음을 통해 공유


형식 유추

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

일반 형식 유추

형식 유추의 개념은 컴파일러가 형식을 결정적으로 추론할 수 없는 경우를 제외하고는 F# 구문의 형식을 지정할 필요가 없다는 것입니다. 명시적 형식 정보를 생략한다고 해서 F#이 동적으로 형식화된 언어이거나 F#의 값이 약한 형식임을 의미하지는 않습니다. F#은 정적으로 형식화된 언어로, 컴파일러가 컴파일 중에 각 구문에 대해 정확한 형식을 추론한다는 것을 의미합니다. 컴파일러가 각 구문의 형식을 추론하기에 충분한 정보가 없는 경우 일반적으로 코드의 어딘가에 명시적 형식 주석을 추가하여 추가 형식 정보를 제공해야 합니다.

매개 변수 및 반환 형식 유추

매개 변수 목록에서 각 매개 변수의 형식을 지정할 필요가 없습니다. 그러나 F#은 정적으로 형식화된 언어이므로 모든 값과 식은 컴파일 시간에 명확한 형식을 가집니다. 명시적으로 지정하지 않은 형식의 경우 컴파일러는 컨텍스트에 따라 형식을 유추합니다. 형식을 지정하지 않으면 제네릭으로 유추됩니다. 코드에서 값을 일관되지 않게 사용하는 경우 값의 모든 사용을 충족하는 단일 유추 형식이 없는 경우 컴파일러는 오류를 보고합니다.

함수의 반환 형식은 함수의 마지막 식 형식에 따라 결정됩니다.

예를 들어 다음 코드에서는 리터럴이 형식이기 때문에 매개 변수 형식 ab 반환 형식이 모두 유추 int 됩니다int.100

let f a b = a + b + 100

리터럴을 변경하여 형식 유추에 영향을 줄 수 있습니다. 접미사u, 형식ab, 반환 값을 추가하여 a uint32 를 만들 100 면 반환 값이 유추됩니다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# 언어 사양에 자세히 설명되어 있습니다.

참고 항목