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

时间:2011-10-10 07:12:17

标签: f#

这两个是等价的:

let f(x) =
    10

let g = fun(x) ->
    10

我想?他们似乎做同样的事情,但是有没有两种情况会有所不同的情况?我发现第二个版本很有用(即使更详细),因为你可以使用<|<<运算符来实现python风格的装饰模式;有没有我 使用第一个版本的情况?

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

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:3)

正如Brian已经回答的那样,两者是等价的。如果您想在返回函数之前执行某些操作(即某些初始化),则返回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实例(所以{{1}写这个是更好的方式)。但是如果你立即返回f2,那么F#编译器会优化代码,两种情况是相同的。