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

Tri*_*rix 14 f# ocaml functional-programming

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

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

Tom*_*cek 27

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

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

let hello = "Hello world"
printfn "%s" hello
Run Code Online (Sandbox Code Playgroud)

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

let add a b = a + b
printfn "22 + 20 = %d" (add 22 20)
Run Code Online (Sandbox Code Playgroud)

你为什么需要它?在F#中,如果没有它,代码将是模糊的.您可以使用值隐藏来创建隐藏前一个符号(具有相同名称)的新符号,因此例如以下内容返回true:

let test () =
  let x = 10
  let x = 20 // hides previous 'x'
  x = 20     // compares 'x' with 20 and returns result
Run Code Online (Sandbox Code Playgroud)

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

let z = (let x = 3 + 3 in x * x)
Run Code Online (Sandbox Code Playgroud)

这里的值z将是36.虽然您可能能够发明一些不需要let关键字的语法,但我认为使用let简单地使代码更具可读性.

  • 看来`let`的引入只是因为`x = y`是模棱两可的?如果`==`用于比较那么`let`变得不必要了吗? (2认同)

Pea*_*ker 9

"让"的主要目的是围绕其定义进行范围.

let <definitions> in <expression>

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