2014-03-07 2 views
6

C++ 및 C#과 같이 정적으로 형식이 지정된 많은 언어에는 로컬 변수 유형 유추가 있습니다 (키워드는 각각 autovar입니다).형식 유추를 반환하는 단점이 있습니까? 그렇다면 무엇입니까?

그러나 나는 컴파일 타임 반환 유형 유추를 구현하는 많은 C 유래 언어 (주석에서 언급 된 것 외에는)를 보지 못했습니다. 나는 질문을하기 전에 "return type inference"가 의미하는 바를 설명 할 것이다. (나는 확실히 는 반환 형식에 의해 과부하를 의미하지 않습니다.)

는 가상의 C# 형 언어로이 코드를 고려해

private auto SomeMethod(int x) 
{ 
    return 3 * x; 
} 

그것은 (인간과 컴파일러에) 명백한 이상하다고 반환 유형은 int (컴파일러가 확인할 수 있음)입니다.

같은

은 여러 경로에 간다 :

private auto YetAnotherMethod(int x) 
{ 
    var r = (x == 0) ? 1 : 3 * x; 
    return r; 
} 

: 이미 언어는 두 표현식이 호환되는 유형이 있는지 여부를 해결하기 위해 말했다에 알고리즘이 있기 때문에

private auto SomeOtherMethod(int x) 
{ 
    if(x == 0) return 1; 
    else return 3 * x; 
} 

그것은 전혀 아직도 모호한 알고리즘이 존재하고 이미 어떤 형태로 구현 되었기 때문에 아마도 이런 점에서 기술적 인 문제는 아닙니다. 그러나 여전히 정적 인 유형의 언어에서는 어디에도 보지 못했습니다. 그 언어에 대해 나쁜 점이 있는지 생각하게되었습니다.


내 질문 : 개념으로

  • 합니까 반환 형식 유추는 불이익 또는 미묘한 함정은 내가 보이지 않아요했다고? (가독성 외에도 이미 이해하고 있습니다.)
  • 정적으로 입력 된 언어에 문제가 있거나 모호한 부분이 있습니까? (으로 나는 지역 변수 형식 유추 이미하지 않는 문제를 말하는 겁니다 "소개".)
+1

D 프로그래밍 언어는 반환 형식 유추를 지원하며 작동합니다 꽤 좋아. –

+1

에릭 리 퍼트 (Eric Lippert)는이 질문에 대답하고 싶습니다.이 주제에 대한 그의 현존하는 답변을 살펴보십시오. –

+0

F #도 있습니다. – Alexan

답변

1

예, 단점이 있습니다. 당신이 이미 언급 한 : 가독성. 두 번째 - 유형을 계산해야하므로 시간이 필요합니다 (튜링 완료 유형 시스템에서는 무한 할 수 있음). 그러나 형식 체계의 이론은 훨씬 더 복잡합니다.

목록을 가져 와서 머리를 반환하는 함수를 작성해 보겠습니다. 그 타입은 무엇입니까? 또는 함수를 취하는 함수이며, 매개 변수는이를 적용하고 결과를 반환합니다. 여러 언어로 선언 할 수는 없습니다. 이런 종류의 것들을 지원하기 위해, 자바는 generics를 도입했으며 비참하게 실패했다. 현재 일관성 문제 때문에 언어의 가장 싫어하는 기능 중 하나임

다른 점 : 반환되는 유형은 함수의 본문뿐만 아니라 호출의 컨텍스트에도 의존 할 수 있습니다. 문자열을 가져 와서 구문 분석하고 반환하는 함수는 read이라는 함수가 있습니다. 필요한 것이 무엇이든 int, 배열을 반환합니다.

그래서 형식 시스템을 디자인 할 때마다 디자이너는 중단 할 수준을 선택해야합니다. 동적 언어는 형식을 전혀 추론하지 않기로 결정했기 때문에 scala는 과부하 또는 재귀 함수와 같은 일부 로컬 유추를 결정했지만 C++은 결과를 유추하지 않기로 결정했습니다

+0

이것은 매우 흥미 롭습니다. Haskell은 지역 변수 타입 유추를 가지고 있습니까? 그렇다면 어떻게 처리할까요? –

+0

나는 haskell에 대해 많이 알지 못하므로 다른 곳에서도 확인하십시오. 네, 로컬 ... 상수가 있습니다. 어떻게 처리되는거야? 그것은 형식 시스템입니다. 그것은 올바른 타입을 계산하고 나중에 타입을 기반으로 원하는 타입을 반환하는'read'의 구현을 선택합니다 – piotrek

관련 문제