gpt4 book ai didi

F#:函数和静态成员之间的柯里化(Currying)差异

转载 作者:行者123 更新时间:2023-12-01 03:41:04 26 4
gpt4 key购买 nike

请有人向我解释一下:

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)不起作用?
如果这很重要,我正在使用带有 .net 4.5.2 的 Visual Studio 2012。

最佳答案

这并不是静态成员和函数之间的真正区别——它有点微妙。这是另一个复制品:

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 B 被编译为带有两个参数的方法(即使它在 F# 中看起来是 curried)。被编译为具有单个参数的方法,该参数返回 F# 函数。这种差异最终是导致您所看到的行为的原因。

关于F#:函数和静态成员之间的柯里化(Currying)差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30779144/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com