gpt4 book ai didi

function - 这些功能有什么区别

转载 作者:行者123 更新时间:2023-12-02 10:00:38 24 4
gpt4 key购买 nike

这些功能完全相同吗?也就是说,第一个和第二个语法只是最后一个语法的方便简写吗?或者是否存在一些理论上或实践上的差异,如果有,是什么?

令 f1 a b = a + b

让 f2 a = (fun b -> a + b)

让 f3 = (fun a -> (fun b -> a + b) )

它们对我来说似乎是一样的,例如,f1 5f2 5f3 5 似乎返回相同的值。只是检查一下我在这里没有做出无效的假设。换句话说,我希望得到一个基于知识的答案,而不是说“是的,我相信它们是相同的”。

最佳答案

你的假设是正确的,在这种情况下,功能是完全相同的。

您可以通过检查生成的 IL 代码(如 Craig 演示的)来了解这一点,还可以通过查看 F# 编译器推断的类型来了解这一点。在这两种情况下,您都会看到 int -> int -> int 。 F# 语言将其视为一个采用 int 的函数。并返回int -> int但它实际上被编译为具有多个参数的方法(为了提高效率)。

如果你写fun紧随let .. =然后编译器将其转换为标准函数。但是,如果您在返回函数之前进行一些计算,则可以编写稍有不同的代码:

let f1 a b = printfn "hi"; a + b
let f2 a = printfn "hi"; (fun b -> a + b)

现在这两个函数非常不同,因为当您只给第二个函数一个参数时,它会打印“hi”(然后它返回一个您可以调用的函数):

> let f = f2 1;;
hi // The body is called, prints
val f : (int -> int) // and returns function

> f 2;; // This runs the body of 'fun'
val it : int = 3 // which performs the additiion

您可以使用 f1 编写相同的代码,但第一个命令只会创建一个新函数,第二个命令将打印“hi”并进行加法。

在本例中,生成的 IL 代码为 f2会有所不同。它将是一个返回函数的函数(类型为 FSharpFunc<int, int> )。 F# 显示的类型也不同 - 它将是 int -> (int -> int)而不是int -> int -> int 。您可以以完全相同的方式使用这两种类型的值,但它暗示您当您给第一个类型提供单个参数时可能会产生一些效果。

关于function - 这些功能有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13139449/

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