当我尝试将带有最后一个参数的函数作为泛型类型进行柯里化时,编译器会将泛型类型强制转换为它找到的第一个具体类型,从而在范围内的后续调用中失去其泛型属性。例子:
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
这里最后两行给了我一个编译器错误,说明该函数需要一个字符串。但是,如果我用辅助类包装函数,我可以让它像这样工作:
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
最后两行抛出编译错误。
这是预期的行为还是错误?如果这是它应该如何工作,有人可以解释为什么吗?这真的让我很困惑。