可以请有人向我解释一下:
type IItem = interface end
type Item = {i:int} interface IItem
type Fail = static member foo (s:string) = fun (x:IItem) -> ""
let foo = fun (s:string) -> fun (x:IItem) -> ""
let works = {i=1} |> foo ""
let fails = {i=1} |> Fail.foo ""
为什么静态成员功能的干扰不起作用?
如果重要的话,我正在使用Visual Studio 2012和.net 4.5.2.
最佳答案 这不是静态成员和函数之间的真正区别 – 它有点微妙.这是另一个复制品:
type T =
static member A () (o:obj) = ()
static member B () = fun (o:obj) -> ()
T.A () 1 // ok
T.B () 1 // huh?
请注意,T.A和T.B的签名是不同的(这实际上在规范的第11.2.1.1节中介绍):
type T =
class
static member A : unit -> o:obj -> unit
static member B : unit -> (obj -> unit)
end
这是一个通常不重要的区别,但基本上它意味着在.NET表示级别A被编译为具有两个参数的方法(即使它看起来在F#中),而B被编译为具有单个参数的方法返回一个F#函数.这种差异最终会导致您所看到的行为.