F#:讨论函数和静态成员之间的差异

时间:2015-06-11 11:10:29

标签: f# currying

可以请别人向我解释一下:

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 ""

为什么静态成员函数的currying不起作用? 如果重要的话,我正在使用Visual Studio 2012和.net 4.5.2。

1 个答案:

答案 0 :(得分:2)

静态成员和函数之间并没有什么区别 - 它有点微妙。这是另一个复制品:

type T =
    static member A () (o:obj) = ()
    static member B () = fun (o:obj) -> ()

T.A () 1 // ok
T.B () 1 // huh?

请注意T.AT.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#中看起来很脆弱)而{{1}编译为一个带有单个参数的方法,该方法返回一个F#函数。这种差异最终会导致您所看到的行为。