3.6.1 하향식 추론(Top-down Inference)
3.6.1 하향식 추론(Top-down Inference)
대부분의 경우 타입은 스스로 추론된 뒤 기대 타입과 유니파이됩니다. 하지만 몇몇 곳에서는 기대 타입이 추론에 영향을 주기 위해 사용될 수 있어요. 그때 우리는 하향식 추론(top-down inference) 이라고 말합니다.
정의: 기대 타입(Expected Type) — 기대 타입은 그 표현식이 타입이 매겨지기 전에 그 타입이 알려진 경우에 발생하는데, 예를 들어 표현식이 함수 호출의 인자인 경우가 그렇습니다. 기대 타입은 하향식 추론을 통해 그 표현식의 타이핑에 영향을 줄 수 있어요.
혼합 타입 배열이 좋은 예시예요. Dynamic에서 언급했듯이, 컴파일러는 요소 타입을 결정할 수 없으므로 [1, "foo"]를 거부해요. 하향식 추론을 사용하면 이 문제를 극복할 수 있습니다:
class Main {
static public function main() {
var a:Array<Dynamic> = [1, "foo"];
}
}
여기서 컴파일러는 [1, "foo"]를 타이핑하는 동안 기대 타입이 Array<Dynamic>임을 알기 때문에 요소 타입은 Dynamic이에요. 평소의 유니피케이션 동작(컴파일러가 공통 기반 타입을 결정하려 시도하고 실패) 대신에, 각 요소는 개별적으로 타이핑되어 Dynamic과 유니파이됩니다.
제네릭 타입 매개변수 생성을 소개할 때 하향식 추론의 또 다른 흥미로운 사용을 보았어요:
import haxe.Constraints;
class Main {
static public function main() {
var s:String = make();
var t:haxe.Template = make();
}
@:generic
static function make<T:Constructible<String>->Void>():T {
return new T("foo");
}
}
여기서 make()의 반환 타입 T는 호출 문맥의 기대 타입(각각 String, haxe.Template)으로부터 추론됩니다. 이렇게 하향식 추론은 제네릭 함수 호출에서 실질적 타입 인자를 결정하는 데 쓰여요.
본문
하향식 추론의 원리
표현식의 타입이 타이핑되기 전에 알려져 있으면(기대 타입), 그 기대 타입이 추론에 영향을 줄 수 있어요. 함수 인자나 변수 초기화의 문맥 타입이 대표적입니다.
예: 혼합 배열
var a:Array<Dynamic> = [1, "foo"];에서 기대 타입이 Array<Dynamic>이므로, 요소 타입을 개별적으로 결정해 유니파이하는 대신 Dynamic으로 유니파이합니다.
예: 제네릭 함수
제네릭 함수의 호출 문맥 기대 타입으로부터 T 같은 타입 매개변수의 실제 타입을 결정할 수 있어요.