2009-05-10 37 views
13

Tôi có một chuỗi FileInfo, nhưng tôi chỉ quan tâm đến tên chuỗi của chúng, vì vậy tôi muốn một chuỗi chuỗi. Lúc đầu, tôi đã cố gắng một cái gì đó như thế này:Tại sao suy luận kiểu F không thể xử lý điều này?

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

Nhưng đối với một số lý do, 's F # suy luận kiểu không phải là tốt, đủ để cho phép điều này, và làm cho tôi một cách rõ ràng cho một loại để 'fi':

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

Tại sao chú thích này lại được yêu cầu? Nếu được biết rằng fis : seq<FileInfo> và rằng Seq.map : ('a -> 'b) -> seq<'a> -> seq<'b>, thì không nên suy ra rằng loại biểu thức lambda là FileInfo -> 'b và sau đó, từ fi.Name : string, tiếp tục suy ra rằng loại của nó là FileInfo -> string?

Trả lời

24

Loại suy luận hoạt động từ trái sang phải. Đây là nơi mà các nhà điều hành đường ống là hữu ích; nếu bạn đã biết loại 'fis', hãy viết nó là

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

và suy luận hoạt động cho bạn.

(Nói chung, biểu hiện dưới hình thức

o.Property 
o.Method args 

đòi hỏi loại 'o' được biết đến tiên; đối với hầu hết các biểu thức khác, khi một loại không được ghìm chặt hệ thống suy luận có thể 'float một ràng buộc' dọc theo đó có thể được giải quyết sau, nhưng đối với những trường hợp này, không có ràng buộc nào của biểu mẫu 'tất cả các loại có thuộc tính có tên P' hoặc 'tất cả các kiểu với phương thức có tên M' (như gõ vịt) có thể được trì hoãn và giải quyết sau. Vì vậy, bạn cần thông tin đó ngay bây giờ hoặc suy luận không thành công ngay lập tức.)

Xem thêm overview of type inference in F#.

+4

Tôi hy vọng họ làm cho suy luận kiểu mạnh mẽ hơn. Tôi đã nhấn một vài trường hợp mà tôi đã phải sắp xếp lại các phương thức trong một lớp hoặc tôi sẽ nhận được các lỗi loại quá chung chung. – gradbot

+1

Đối với giá trị của nó, bài đăng trên blog này và một số nhận xét của nó có một giải thích hữu ích về một số điểm mạnh và điểm yếu của F # trong trình kiểm tra loại của nó: http://neilmitchell.blogspot.com/2008/12/f-from-haskell- perspective.html – Juliet

Các vấn đề liên quan