F#和OCaml等函数式语言中的“let”关键字是什么?

时间:2010-05-16 14:12:03

标签: f# ocaml functional-programming

在查看F#,Ocaml和其他函数式语言代码示例时,我注意到let关键字经常被使用。

  • 你为什么需要它?为什么语言设计得有它?
  • 为什么你不能把它留下来?例如:令x = 4变为x = 4

6 个答案:

答案 0 :(得分:27)

在F#(和OCaml)中let是非常强大的构造,用于值绑定,这意味着为符号赋予一些含义。这可能意味着各种各样的事情:

声明本地或全局值 - 您可以使用它来声明本地值。这类似于在命令式语言中创建变量,但变量的值以后不能更改(它是不可变的):

let hello = "Hello world"
printfn "%s" hello

声明功能 - 您也可以使用它来声明功能。在这种情况下,您指定符号是具有某些arity的函数:

let add a b = a + b
printfn "22 + 20 = %d" (add 22 20)

为什么需要它?在F#中,如果没有它,代码就会模糊不清。您可以使用值隐藏来创建隐藏上一个符号(具有相同名称)的新符号,例如,以下内容返回true

let test () =
  let x = 10
  let x = 20 // hides previous 'x'
  x = 20     // compares 'x' with 20 and returns result

如果您省略了let关键字,则无法知道您是在比较值还是在宣布新符号。另外,如其他人所述,您可以使用let <symbol> = <expression> in <expression>语法(如果在F#中使用换行符,则不需要in)将值绑定写为另一个表达式的一部分:< / p>

let z = (let x = 3 + 3 in x * x)

此处,z的值为36.虽然您可能会发明一些不需要let关键字的语法,但我认为使用let只会使代码更具可读性。

答案 1 :(得分:9)

“让”的主要目的是围绕其定义进行范围。

let <definitions> in <expression>

确保定义不会污染<expression>以外的任何名称空间。

答案 2 :(得分:4)

“let”引入了一个新的变量作用域,并允许您将变量绑定到该作用域的值。它通常被理解为“让x为[值]在......”。如果没有赋值,则避免使用冲突的变量名称非常有用。

答案 3 :(得分:3)

在Haskell,

foo = let x = 5
      y = 7
      in z=x+y

用于表明x和y是foo的“私有”变量。

答案 4 :(得分:1)

意味着“将值绑定到名称”并且通常会说出,创建一个新变量。 x = 4表示“将4分配给x”,但不会创建新名称。

请参阅http://msdn.microsoft.com/en-us/library/dd233238.aspx

答案 5 :(得分:1)

如果您正在学习,this lecture也可能是相关的,尤其是。关于评估let term的部分。