没有参数的F#lambda表达式

时间:2017-01-31 19:52:52

标签: lambda f#

我是F#的新手,我想使用没有参数的lambda表达式。 这很好用:

let a = fun () -> 2
a()

它返回2.

但是现在我想要它返回6:

let a = 3* (fun () -> 2)
a()

但是得到一个静态错误,该函数有太多的参数或者不能在这种情况下使用。

但这也有效:

let a = 3* (fun _ -> 2) 4
a

请注意, a 现在不能用作()

的功能

你能解释一下吗?

2 个答案:

答案 0 :(得分:8)

嗯,表达式fun() -> 2函数。不是数字,不是字符串,不是字节数组,而是 函数 。与函数唯一相关的是调用它。或者,换句话说,执行它。 调用它。这是你用a()做的事情。你传给它一个参数()(是的,连续两个括号是F#中的实际内容,你可以将它作为参数传递),然后该函数运行并返回一个结果。这是2。一个数字。

所以,再一次:首先你有一个功能。然后你执行它。而执行的结果是一个数字。

现在,如果你想将一个函数乘以三......你的意思是什么?那有点荒谬。你的意思是它的执行时间要长三倍吗?或者返回三个结果而不是一个?乘以数字不是你可以用函数做的事情。

如果您希望另一个函数返回6而不是2,那么就这样说:

let a = fun() -> 2*3

或者,如果您想要使用第一个函数并在其上构建另一个函数 ,通过乘以第一个函数的结果, - 那么您需要先调用第二个函数(调用,执行)第一个函数,获取结果,然后将 乘以三:

let a = fun() -> 2
let b = fun() -> a() * 3

至于最后一个例子 - 这有点棘手。

首先,表达式fun _ -> 2。这也是一个功能。它需要一个参数。它并不关心那个参数是什么。它有点说"我会带任何参数,无论你向我投掷什么,我都不在乎,我会回复你2无论如何&#34 ;.所以你可以抛出任何参数。例如,您可以向其投掷4。它需要4,并不值得骄傲。 4很好。那是(fun _ -> 2) 4你正在做的事情。这意味着"创建一个接受任何参数并返回2的函数,并使用参数4"执行该函数。

您可以通过更长一点但更容易理解的方式表达相同的想法:

let a = fun _ -> 2
let b = a 4   // b = 2

然后,作为最后一步,您将使用参数4执行该函数的结果,并将该结果乘以3。你得到6。这是一个数字。而不是一个功能。因此,您无法执行(调用,调用)它。因为,您知道,您无法执行号码。只是一个功能。

答案 1 :(得分:2)

我明白。因此,如果我希望它是表达式而不是函数,我需要调用函数:

let a = 3* (fun () -> 2)()

所以,这里a = 6