3.6 타입 추론(Type Inference)

3.6 타입 추론(Type Inference)

타입 추론의 효과는 이 문서 전반에 걸쳐 보아 왔고, 앞으로도 계속 중요할 거예요. 간단한 예제가 타입 추론이 동작하는 모습을 보여줍니다:

class Main {
  public static function main() {
    var x = null;
    $type(x); // Unknown
    x = "foo";
    $type(x); // String
  }
}

특수 구조 $type함수 타입(Function Type)에 대한 설명을 단순화하기 위해 앞서 언급했어요. 이제 공식적으로 소개할게요:

정의: $type$type은 함수처럼 인자 하나를 받아 호출되는 컴파일 타임 메커니즘입니다. 컴파일러는 인자 표현식을 평가한 뒤 그 표현식의 타입을 출력해요.

위 예제에서 첫 $typeUnknown<0>을 출력해요. 이것은 모노모프(monomorph), 즉 아직 알려지지 않은 타입입니다. 다음 줄 x = "foo"xString 리터럴을 할당하는데, 이는 모노모프와 String유니피케이션(unification)을 일으켜요. 그러면 x의 타입이 String으로 바뀐 것을 볼 수 있습니다.

Dynamic이 아닌 다른 타입이 모노모프와 유니파이될 때마다, 그 모노모프는 그 타입으로 모프(morph), 즉 더 간단히 말해 그 타입이 됩니다. 따라서 나중에 다른 타입으로 모프할 수 없어요. 이것은 이름에서 mono(하나)라는 부분에 표현된 속성입니다.

유니피케이션 규칙을 따라, 타입 추론은 복합 타입에서도 발생할 수 있어요:

class Main {
  public static function main() {
    var x = [];
    $type(x); // Array<Unknown<0>>
    x.push("foo");
    $type(x); // Array<String>
  }
}

변수 x는 먼저 빈 Array로 초기화돼요. 이 시점에서 x의 타입이 배열이라는 것은 알 수 있지만, 배열 요소의 타입은 아직 모릅니다. 따라서 x의 타입은 Array<Unknown<0>>이에요. 배열에 String을 push한 뒤에야 타입이 Array<String>임을 알게 됩니다.

출처: Type Inference

본문

$type과 모노모프

$type(expression)은 컴파일 타임에 표현식의 타입을 출력하는 특수 구조예요. 아직 결정되지 않은 타입은 모노모프이며 Unknown으로 표시되고, 값이 할당되면 그 타입으로 확정됩니다.

모노모프의 모핑

모노모프는 비-Dynamic 타입과 유니파이되면 그 타입으로 확정되며, 이후 다른 타입으로 바뀌지 않아요. 그래서 이름에 "mono"(하나)가 들어간 것입니다.

복합 타입에서의 추론

타입 추론은 요소를 가진 복합 타입에도 적용돼요. 빈 Array는 먼저 Array<Unknown>으로 추론되고, String을 push하면 Array<String>으로 확정됩니다.

더 알아보기