我是F#的新手,我想使用没有参数的lambda表达式。 这很好用:
let a = fun () -> 2
a()
它返回2.
但是现在我想要它返回6:
let a = 3* (fun () -> 2)
a()
但是得到一个静态错误,该函数有太多的参数或者不能在这种情况下使用。
但这也有效:
let a = 3* (fun _ -> 2) 4
a
请注意, a 现在不能用作()
的功能你能解释一下吗?
答案 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