2011-09-26 4 views
1

Section 15.3 of the spec은 공백이있는 < > 시퀀스가 ​​허용되는 형식임을 나타냅니다. 이는 다음과 같은 기이함을 허용하는 일반 인수의 빈 목록을 나타냅니다.일반 인수가 빈 목록

type A() = class end 
let a = new A< >() 

왜 허용됩니까? 제네릭 형식은 형식 args가 생략 된 상태에서 인스턴스화 될 수 있으므로이 형식 검사는 형식 최적화입니까?

+0

구체적으로 가야하는 이유를 생각해서 금지시킬 수 있습니까? –

+0

@Tomalak : 예. 타입 인자는 비 - 제네릭 클래스에는 적용되지 않습니다 ?? – Daniel

+0

@Tomalak : 유형 인자가 클래스에 명시 적이어야하므로 더 이상한 것처럼 보입니다. 그 경우가 아니라면 클래스가 일반적이지 않음을 나타내는 데 유용하다는 것을 알 수있었습니다. – Daniel

답변

5

라몬 (Ramon)은 일을보다 일관성있게 만든다는 점에 동의합니다. 제네릭 형식을 제너릭 방식의 퇴화 사례로 취급 할 수 있다는 점에서 동의합니다. 제네릭 방식으로 "오버로드"되는 유형의 경우이 당신이 언급하고있는 유형에 대한 자세한 명시 할 수 있습니다 :

type T(o:obj) = class end 
type T<'t>(t:'t) = class end 

let t = T("test") 
let t' = T< >("test") 
let t'' = T<_>("test") 

오버로드 확인에 대해 신중하게 생각하지 않고, t가 무슨 타입 반드시 분명 아니지만,이 t't''이 가진 어떤 종류의 완전히 분명하다.

+0

좋은 예입니다. 유스 케이스를 내놓으려고 애썼다. – Daniel

2

나는 그것이 단지 일관성을위한 것이라고 생각합니다. List<int>Dictionary<string, bool>을 할 수 있으므로 int< >도 할 수 있습니다.

+0

어떻게 일관성이 있습니까? 'List'와'Dictionary'는 generic입니다. int는 그렇지 않습니다. – Daniel

+1

당신은 잘못된 길로 그것을보고 있습니다. (글쎄, 그것은 올바른 길입니다.하지만 그들이 생각한 바를 이해하기 위해서는 잘못된 길입니다.) ''List''는 1 개의 일반적인 인자를 가지고 있으므로''< >''에서 하나의 항목을 얻습니다.''Dictionary''는 2를 가지므로 2 개의 항목을 가져오고''int''는 0이므로 항목이 0이됩니다. . 그것을 불공평하게 생각하는 대신에 ("사랑스러운 형용사"), 일반적인 것인가, 아니면 "일반적인 인자가 얼마나 많은지"로 생각하십시오. –

+0

명확히하기 : 나는 그 구문을 사용해야한다고 생각하지 않지만,이 이유 때문에 거기에 있습니다. –