2010-12-19 4 views
4

カリースタイルポリモーフィックタイプのシステムで期待されているように、以下はうまくいきます。これは「、F#ポリモルフィックタイプ

let f x = x 
printfn "%A" (f 2) 
printfn "%A" (f 3.4) 

しかし、我々はもう少し複雑な何かをしようとすると、それは、3行目の失敗: - 恒等関数は「>」、実際には各タイプごとに1つの関数の無限の家族です式はint型を持つことが期待されるが、ここで「float型を持つました:(。しかし、予想通り二行目は、三行目の作業を行いコメントアウト)

let f x = string x 
printfn "%A" (f 2) 
printfn "%A" (f 3.4) 

をA先験的、私は種類を期待しているだろう推論はいずれかの動作をするカレットスタイルは、不特定の型が事実上一般的な、または他のバージョンの関数をロックダウンすることができますが、私が見る限り、最初のケースでは前者を行い、後者のケースでは後者を行います。私はちょうど私がピックアップしていない動作の背後にいくつかの論理があると思います。私は何が欠けていますか?

答えて

6

ここでは、「帽子の種類」には非標準的なことが起こっています。 'string'のようなF#関数の中には、静的最適化の制約や特定のメンバ関数の存在に基づく型があります。これらは「インライン」関数でのみ一般化することができます。そうでない場合は、使用法に基づいて単相性型を取ります。

+6

これは、 'let inline f x = string x'は、2番目の例を最初のように振る舞わせることを意味します。 – kvb