F#:定义函数的两种方法?

发布于 2024-12-08 17:59:53 字数 340 浏览 1 评论 0原文

这两个是等价的:

let f(x) =
    10

let g = fun(x) ->
    10

我认为?他们似乎做同样的事情,但是在某些情况下两者的行为会有所不同吗?我发现第二个版本很有用(即使更冗长),因为您可以使用 <|<< 运算符来实现 python 风格的装饰器模式;有没有什么情况我必须使用第一个版本?

此外,我完全理解第二个是如何工作的(右边的东西只是一个函数表达式,我将其转储到 g 中)但是第一个怎么样?是否有一些编译器技巧或特殊情况将该语法从简单的赋值语句转换为函数定义?

These two are equivalent:

let f(x) =
    10

let g = fun(x) ->
    10

I think? They seem to do the same thing, but are there any cases where the behavior of the two would vary? I find the second version useful (even if more verbose) because you can use the <| and << operators to implement python-style decorator patterns; is there any case where I have to use the first version?

Furthermore, I fully understand how the second one works (the stuff on the right is just a function expression, which I dump into g) but how about the first one? Is there some compiler trick or special case that converts that syntax from a simple assignment statement into a function definition?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

会发光的星星闪亮亮i 2024-12-15 17:59:53

它们是等价的(以“值限制”为模,允许函数而不是值是通用的,请参见例如

They are equivalent (modulo the 'value restriction', which allows functions, but not values, to be generic, see e.g. here).

小梨窩很甜 2024-12-15 17:59:53

正如布莱恩已经回答的那样,两者是等价的。如果您想在返回函数之前执行某些操作(即一些初始化),则返回 fun 而不是使用 let 声明函数会有所不同。

例如,如果您想创建添加随机数的函数,您可以编写:

let f1 x = 
  let rnd = new System.Random()
  x + rnd.Next()

let f2 = 
  let rnd = new System.Random()
  fun y -> y + rnd.Next()

这里,函数 f1 每次执行时都会创建新的 Random 实例,但是 f2 始终使用相同的 rnd 实例(因此 f2 是更好的编写方式)。但如果立即返回 fun,那么 F# 编译器会优化代码,两种情况是相同的。

As Brian already answered, the two are equivalent. Returning fun instead of declaring function using let makes difference if you want to do something (i.e. some initialization) before returning the function.

For example, if you wanted to create function that adds random number, you could write:

let f1 x = 
  let rnd = new System.Random()
  x + rnd.Next()

let f2 = 
  let rnd = new System.Random()
  fun y -> y + rnd.Next()

Here, the function f1 creates new Random instance every time it is executed, but f2 uses the same instance of rnd all the time (so f2 is better way of writing this). But if you return fun immediately, then the F# compiler optimizes the code and the two cases are the same.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文