没有参数的F#lambda表达式

dmi*_*try 4 lambda f#

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

let a = fun () -> 2
a()
Run Code Online (Sandbox Code Playgroud)

它返回2.

但现在我想要它返回6:

let a = 3* (fun () -> 2)
a()
Run Code Online (Sandbox Code Playgroud)

但是得到一个静态错误,该函数有太多的参数或者不能在这个上下文中使用.

但这也有效:

let a = 3* (fun _ -> 2) 4
a
Run Code Online (Sandbox Code Playgroud)

需要注意的是一个现在还不能用作函数为()

你能解释一下吗?

Fyo*_*kin 8

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

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

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

如果你想要另一个返回a 6而不是的函数2,那么就这样说:

let a = fun() -> 2*3
Run Code Online (Sandbox Code Playgroud)

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

let a = fun() -> 2
let b = fun() -> a() * 3
Run Code Online (Sandbox Code Playgroud)

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

首先,表达fun _ -> 2.这也是一个功能.它需要一个参数.而且它并不关心那个参数是什么.它有点说"我会接受任何参数,无论你向我扔什么,我都不在乎,2无论如何我会回报你".所以你可以抛出任何参数.例如,你可以抛出4它.它需要一个4,它并不自豪.4很好.这就是你正在做的事情(fun _ -> 2) 4.这意味着"创建一个接受任何参数并返回2的函数,并使用参数4执行该函数".

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

let a = fun _ -> 2
let b = a 4   // b = 2
Run Code Online (Sandbox Code Playgroud)

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

  • 好吧,惊喜!您也可以使用F#执行此操作:`2*(如果为true,则为2,否则为1)` (2认同)
  • 如果它有帮助:在Haskell中,你的第二个例子看起来像这样:`a = 3*(\() - > 2)`.它不会像在F#中那样编译. (2认同)