最後のパラメーターをジェネリック型として関数をカリー化しようとすると、コンパイラーはジェネリック型を最初に見つけた具体的な型に強制するため、スコープ内の後続の呼び出しのジェネリック プロパティが失われます。例:
type Bar =
| String
| Integer
| Boolean
let foo (a: String)(b: 'm) =
printfn "%A - %A" a b
let foobar (a: String)(bar: Bar) =
let fooWithA= foo a
match bar with
| String -> fooWithA "String"
| Integer -> fooWithA 42
| Boolean -> fooWithA true
ここで、最後の 2 行で、関数が文字列を予期していることを示すコンパイラ エラーが表示されます。ただし、関数をヘルパー クラスでラップすると、次のように機能させることができます。
type FooHelper(a:String) =
member this.foo (b: 'm) =
printfn "%A - %A" a b
let foobar (a: String)(bar: Bar) =
let fooHelperWithA= FooHelper a
match bar with
| String -> fooHelperWithA.foo "String"
| Integer -> fooHelperWithA.foo 42
| Boolean -> fooHelperWithA.foo true
それは私にコンパイラエラーを与えません。次に、関数を直接使用しようとすると、コンパイルエラーが再び発生します。
let foobar (a: String)(bar: Bar) =
let fooHelperWithA= FooHelper(a).foo
match bar with
| String -> fooHelperWithA "String"
| Integer -> fooHelperWithA 42
| Boolean -> fooHelperWithA true
最後の 2 行でコンパイル エラーがスローされます。
これは意図した動作ですか、それともバグですか? これが機能する方法である場合、誰かが理由を説明できますか? これは私を本当に混乱させます。