2013-05-22 2 views
2

나는 F #을 배우기 시작했으며, C# 구문의 주요 차이점 중 하나는 형식 유추가 C#보다 훨씬 많이 사용된다는 점이었다. 이것은 대개 F #의 이점 중 하나로 제시됩니다. 유형 유추가 왜 유익한 것으로 나타 납니까?유형 유추의 이점은 무엇입니까?

다른 클래스를 사용하는 클래스 계층 구조와 코드가 있다고 상상해보십시오. 강력한 타이핑을 사용하면 어떤 방법으로 어떤 클래스가 사용되는지 빠르게 감지 할 수 있습니다. 타입 유추를 사용하면 너무 명확하지 않으므로 힌트를 사용하여 어떤 클래스를 사용해야하는지 이해해야합니다. F # 코드를 타입 유추로보다 읽기 쉽게 만드는 기술이 있습니까?

+1

이것은 일종의 광범위한 질문입니다. 질문을 좀 더 구체적으로 편집 할 수 있을까요? –

답변

7

이 질문은 F #에서 객체 지향 프로그래밍 (예 : 복합 클래스 계층 구조)을 사용한다고 가정합니다. OO 개념을 사용하면 .NET 라이브러리에서 F # 기능을 랩핑하거나 상호 운용성을 위해 주로 유용합니다.

코드를 이해하십시오. 타입 추론은 코드를 함수 스타일로 작성할 때 훨씬 유용합니다. 코드가 짧아 지지만 진행 상황을 이해하는데도 도움이됩니다. 당신이 (LINQ의 Select 방법) 목록을 통해 map 기능을 작성하는 경우 예를 들어, :

let map f list = 
    seq { for el in list -> f el } 

유형의 추론은 함수 유형이 있음을 알려줍니다 :

val map : f:('a -> 'b) -> list:seq<'a> -> seq<'b> 

이 우리 일에 대해 우리의 기대와 일치 쓰기를 원한다 - 인수 f'a 유형의 값을 'b 유형의 값으로 변환하고 map 기능은 'a 값의 목록을 취하여 'b 값 목록을 작성하는 함수입니다. 따라서 형식 유추를 사용하여 코드가 기대하는 바를 쉽게 수행하는지 확인할 수 있습니다.

일반화. 자동 일반화 (주석에 언급)는 위의 코드가 자동으로 최대한 재사용 될 수 있음을 의미합니다. C#에서, 당신은 작성할 수 있습니다

IEnumerable<int> Select(IEnumerable<int> list, Func<int, int> f) { 
    foreach(int el in list) 
    yield return f(el); 
} 

이 방법은 일반적인 아니다 - 그것은 단지 int 값의 컬렉션에서 작동 Select입니다. 그러나 int으로 제한해야하는 이유는 없습니다. 동일한 코드가 모든 유형에서 작동합니다. 타입 유추 메커니즘은 그러한 일반화를 발견하는 데 도움이됩니다.

자세한 내용은. 마지막으로 추론 덕분에 F # 언어는 모든 유형을 명시 적으로 작성해야 할 때보 다 더 많은 것을 쉽게 확인할 수 있습니다. 이 언어의 여러 측면에 적용하지만, 최고의 측정 단위 사용하여 설명된다 :

let l = 1000.0<meter> 
let s = 60.0<second> 
let speed = l/s 

은 F # 컴파일러는 speed이 유형 float<meter/second>을 가지고 추론 - 그것은 이해하는 방법을 측정 작업 단위 및 유형을 포함하여 장치를 추론을 정보. 이 기능은 정말 유용하지만 유형이 오래 걸리기 때문에 모든 단위를 직접 작성해야한다면 사용하기가 어렵습니다. 일반적으로 더 정확한 유형을 사용할 수 있습니다 (항상 입력 할 필요가 없기 때문에).

+0

자세한 답변을 해주셔서 감사합니다. 특히 자동 일반화에 대한 설명에 대해 감사드립니다.이 기능에 대해 알지 못했습니다. – eternity

관련 문제