EDIT
ベター/最近の情報はここにある:Keeping partially applied function generic
(以下オリジナル)
私は思いますここでの実用的なことは、これをあまり深く理解しようとするのではなく、むしろVRを過ぎてあなたの仕事に進むための一般的な戦略を知ることです。これはちょっとしたコップアウトの答えですが、ここではF#タイプのシステム(リリースからリリースにかけて少しずつ変わり続けています)の内部構造を理解するのに時間を費やすことは意味がありません。
私が主張する2つの主な戦略は次のとおりです。あなたは(「 - >」矢印付きタイプ)関数型と値を定義している場合、最初に、そしてeta-conversionを行うことによって、それは構文上の機能であることを確認:
// function that looks like a value, problem
let tupleList = List.map (fun x -> x,x)
// make it a syntactic function by adding argument to both sides
let tupleList l = List.map (fun x -> x,x) l
第二に、あなたはまだVRが発生した場合/問題を一般化(F#が許す限り「バックオフ」当時と)、その後、あなたが欲しいものを言って全体の型シグネチャを指定します。
// below has a problem...
let toleq (e:float<_>) a b = (abs (a - b)) < e
// so be fully explicit, get it working...
let toleq<[<Measure>]'u> (e:float<'u>) (a:float<'u>) (b:float<'u>) : bool =
(abs (a - b)) < e
// then can experiment with removing annotations one-by-one...
let toleq<[<Measure>]'u> e (a:float<'u>) b = (abs (a - b)) < e
私はそれらの2つの戦略が最善の実践的なアドバイスだと思います。それは、あなたの特定の質問に答える私の試みです。
私は分かりません。
'>'は、すべての型で機能する完全な汎用関数( 'a - >' a - > bool)です。したがって、is_biggerは一般化します。一方、 '+'は、いくつかのプリミティブ型とある種の他の型で動作する「インライン」関数です。他のインライン関数内でのみ一般化することができます。そうでなければ、特定の型に固定する必要があります(またはデフォルトは 'int'になります)。 (アドホック多型の 'インライン'メソッドは、F#の数学演算子が "型クラス"の欠如を克服する方法です。)これは私が上で議論した '構文関数'の問題です。 '関数とは異なり、汎用的ではないフィールド/プロパティにコンパイルしましょう。だから、それを汎用的にしたいのであれば、それを関数にしてください。 (この規則の別の例外のためにもthis questionを参照してくださいません。)
同じトピックについての別の質問とのクロスリファレンス:http://stackoverflow.com/questions/416508/f-compiler-error-fs0030-problems-with-the-value-restriction – Benjol