2009-05-10 9 views
13

FileInfo 시퀀스가 ​​있지만 문자열 이름 만 신경 써서 문자열 시퀀스가 ​​필요합니다. 처음에 나는이 같은 시도 :F #의 형식 유추가 왜 이것을 처리 할 수 ​​없습니까?

Seq.map (fun fi -> fi.Name) fis 

을하지만 어떤 이유로, F #의 형식 유추이 허용하는 충분하지 않습니다, 나 명시 적으로 "파이"유형을 제공했다 :

Seq.map (fun (fi : FileInfo) -> fi.Name) fis 

이 주석은 왜 필요합니까? fis : seq<FileInfo>과 그 Seq.map : ('a -> 'b) -> seq<'a> -> seq<'b>이 알려져 있다면 람다 식의 형식이 FileInfo -> 'b이고 그 다음에 fi.Name : string에서 더 종류가 FileInfo -> string이라고 추측해서는 안됩니까?

답변

24

유형 추론은 왼쪽에서 오른쪽으로 작동합니다. 파이프 라인 연산자가 유용합니다. 'fis'유형을 이미 알고있는 경우

fis |> Seq.map (fun fi -> fi.Name) 

등으로 작성하면 추측이 가능합니다. 형태

o.Property 
o.Method args 

의 일반적

(식은 공지되는 'O'의 입력을 요구 선험적; 일종 추론 시스템 수의 아래에 고정되지 않고 대부분의 다른 표현을위한 'float a constraint'은 나중에 풀 수 있지만,이 경우 'P라는 속성을 가진 모든 유형'또는 'M이라는 메소드가있는 모든 유형'(오리 입력과 같은) 형식의 제약이 없습니다. 나중에 연기하거나 해결해야하므로 지금 정보가 필요하거나 추측이 즉시 실패합니다.)

도 참조하십시오. overview of type inference in F#.

+4

그들은 형식 ​​추론을보다 강력하게 만들어주기를 바랍니다. 이미 클래스의 메서드를 재정렬해야하는 경우 나 너무 일반적인 형식의 오류가 발생하는 경우가 있습니다. – gradbot

+1

이 블로그 게시물과 그 코멘트 중 일부는 F #의 유형 검사기의 강점과 약점에 대한 유용한 설명이 있습니다. http://neilmitchell.blogspot.com/2008/12/f-from-haskell- perspective.html – Juliet

관련 문제