2009-05-10 14 views
13

私はFileInfoのシーケンスを持っていますが、文字列の名前だけを気にするので、文字列のシーケンスが必要です。最初は私はこのような何か試してみました:なぜF#の型推論でこれを処理できないのですか?

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

をしかし、いくつかの理由で、F#の型推論はこれを可能にするのに十分に良好ではない、と私は明示的に 『Fiの』にタイプを与えて作っ:

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

関連する問題