不带参数的F#lambda表达式

不带参数的F#lambda表达式,lambda,f#,Lambda,F#,我是F#的新手,我想使用不带参数的lambda表达式。 这很好: let a = fun () -> 2 a() 它返回2 但现在我想让它返回6: let a = 3* (fun () -> 2) a() 但得到一个静态错误,该函数有太多参数或不能在此上下文中使用 但这同样有效: let a = 3* (fun _ -> 2) 4 a 请注意,now不能用作()的函数 你能解释一下吗?嗯,表达式fun()->2是一个函数。不是数字,不是字符串,不是字节数组,而是函数。函数

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

let a = fun () -> 2
a()
它返回2

但现在我想让它返回6:

let a = 3* (fun () -> 2)
a()
但得到一个静态错误,该函数有太多参数或不能在此上下文中使用

但这同样有效:

let a = 3* (fun _ -> 2) 4
a
请注意,now不能用作()的函数


你能解释一下吗?

嗯,表达式
fun()->2
是一个函数。不是数字,不是字符串,不是字节数组,而是函数。函数唯一要做的就是调用它。或者,换句话说,执行它。调用它。这就是使用
a()
所做的。您向它传递一个参数
()
(是的,一行中的两个括号在F#中是实际的,您可以将其作为参数传递),然后函数运行并返回一个结果。这是
2
。一个数字

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

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

如果您想要另一个返回
6
而不是
2
的函数,只需这样说:

let a = fun() -> 2*3
或者,如果您想获取第一个函数并在其上构建另一个函数,将第一个函数的结果相乘,-那么您需要让第二个函数首先调用(调用、执行)第一个函数,获取其结果,并将其乘以三:

let a = fun() -> 2
let b = fun() -> a() * 3
至于最后一个例子——这有点棘手

首先,表达式
fun->2
。这也是一个函数。它需要一个参数。它不在乎这个参数是什么。它有点像是在说“我会接受任何参数,不管你扔给我什么,我不在乎,反正我会返回你
2
”。所以你可以对它抛出任何参数。例如,您可以向其投掷
4
。它需要一个
4
,它并不骄傲<代码>4很好。这就是你所做的。这意味着“创建一个接受任何参数并返回2的函数,然后使用参数4执行该函数”

你可以用一种稍微长一点但更容易理解的方式来表达同样的想法:

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

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

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

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

所以,这里a=6,我的想法是从函数中得到结果,当然,不是和函数混合。我想在表达式中使用is,比如C中的?:运算符#让myDouble(x,needDouble)=x*(乐趣()->如果needDouble,那么2,否则1)我不能在F中这样做,对吗?你把一个函数乘以一个数字是什么意思?正如我上面所说,那样做是荒谬的。请澄清你到底想从中得到什么。好吧,惊喜!你也可以用F#来实现这一点:
2*(如果为真,则为2,否则为1)
如果有帮助:在Haskell中,你的第二个例子如下:
a=3*(\()->2)
。而且它不会像在F#中那样编译。