Generics 为什么显式泛型函数值绑定不同于类似的非泛型函数值绑定?

Generics 为什么显式泛型函数值绑定不同于类似的非泛型函数值绑定?,generics,f#,Generics,F#,让我们用一个简单的函数值f1: let f1 = printfn "*bind f1*"; fun () -> printfn "f1()" f1将FSI绑定为 *bind f1* val f1 : (unit -> unit) val f2<'a> : (unit -> unit) 并且,在被调用时,其行为符合预期 > () |> f1 |> f1;; f1() f1() val it : unit = () 现在让我们取一个类似的函数值

让我们用一个简单的函数值
f1

let f1 = printfn "*bind f1*"; fun () -> printfn "f1()"
f1
将FSI绑定为

*bind f1*
val f1 : (unit -> unit)
val f2<'a> : (unit -> unit)
并且,在被调用时,其行为符合预期

> () |> f1 |> f1;;
f1()
f1()
val it : unit = ()

现在让我们取一个类似的函数值,但是使显式泛型<代码> f2f>通常不允许创建泛型值,因为引入的“值限制”困难(也就是说,即使它是一个返回函数的代码,也不能创建一个通用的语法值)。因此,您的

f2
不应该被允许,但是

该规则只有一个例外-通常使用诸如
List.empty
之类的泛型值非常有用,因此如果您使用显式泛型类型参数声明一个值,它实际上会编译成一个返回结果的函数

这正是您的示例中发生的情况:

let f2<'a> = printfn "*bind f2*"; fun () -> printfn "f2()"

像往常一样,让f2托马斯是对的。请注意,您可以创建一个行为与
f1
相同的泛型函数,但必须使用一个标称泛型类型作为排序缓存:

type private Container<'a> () =
    static member val f2 : unit -> unit = printfn "*bind f2*"; fun () -> printfn "f2()"

let f2<'a>() = Container<'a>.f2()

type private Container()=Containerf2是一个类型函数(f#spec中的10.2.3)@desco:谢谢你,弗拉基米尔!如果你不介意把这个写进一个答案,我很乐意接受。
let f2<'a> = printfn "*bind f2*"; fun () -> printfn "f2()"
type private Container<'a> () =
    static member val f2 : unit -> unit = printfn "*bind f2*"; fun () -> printfn "f2()"

let f2<'a>() = Container<'a>.f2()