什么是「;让我们;函数语言中的关键字,如F#和OCaml for?
在查看F#、Ocaml和其他函数式语言代码示例时,我注意到let关键字经常被使用什么是「;让我们;函数语言中的关键字,如F#和OCaml for?,f#,ocaml,functional-programming,F#,Ocaml,Functional Programming,在查看F#、Ocaml和其他函数式语言代码示例时,我注意到let关键字经常被使用 你为什么需要它?为什么这些语言被设计成拥有它 你为什么不能把它删掉?e、 g:设x=4变为x=4 let的意思是“将值绑定到名称”,一般来说,它创建一个新变量。 x=4表示“将4分配给x”,这不会创建新名称 参见“let”的主要目的是在其定义周围放置一个范围 let-in 确保这些定义不会污染除以外的任何名称空间。“let”引入一个新的变量作用域,并允许您将变量绑定到该作用域的值。它通常被解读为“让x成为……中的
- 你为什么需要它?为什么这些语言被设计成拥有它
- 你为什么不能把它删掉?e、 g:设x=4变为x=4
- let的意思是“将值绑定到名称”,一般来说,它创建一个新变量。
x=4
表示“将4分配给x”,这不会创建新名称
参见“let”的主要目的是在其定义周围放置一个范围
let-in
确保这些定义不会污染除
以外的任何名称空间。“let”引入一个新的变量作用域,并允许您将变量绑定到该作用域的值。它通常被解读为“让x成为……中的[value]。当您没有赋值时,避免变量名冲突非常有用。在Haskell中
foo = let x = 5
y = 7
in z=x+y
用于明确x和y是foo的“私有”变量 在F#(和OCaml)中,let是一种非常强大的构造,用于值绑定,这意味着赋予符号某种意义。这可能意味着各种事情:
声明本地或全局值-您可以使用它声明本地值。这类似于在命令式语言中创建变量,只是变量的值以后不能更改(它是不可变的):
声明函数-您也可以使用它声明函数。在这种情况下,指定符号是具有某种算术性的函数:
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=in
语法(如果在F#中使用换行符,则不需要in
)将值绑定作为另一个表达式的一部分写入:
let z = (let x = 3 + 3 in x * x)
这里,
z
的值将为36。虽然您可以发明一些不需要使用let
关键字的语法,但我认为使用let
只会使代码更具可读性。如果您喜欢学习,也可能与此相关,特别是关于计算let项的部分。但在F#中,即使对于非局部变量,也需要编写let foo=…
。可能是Lisp的传统用法,在Lisp中,它们通常不使用=
和中缀语法。实际上,在F#和ocamlx=4中,都是一个布尔运算,返回真正的iff x等于4。这不是赋值。似乎引入let
只是因为x=y
不明确?如果使用=
进行比较,那么let
是否就没有必要了?@KennyTM:原则上,你完全可以发明一些不含糊的语法,但我认为let
非常可读。另外,在完整的语法中,let
与in
(因为它是一个表达式-在F#中没有语句),所以您需要类似的东西。当我在F#中看到let
w/outin
时,我会发抖。。。作为一名ocaml程序员,我认为
中的在可读性和格式方面有很大帮助。为什么F#程序员没有这么多地使用它?@nlucaroni您可以在F#中使用OCaml'in'语法,方法是省略文件开头的“#light”选项。F#设计者认为ocaml语法有点冗长,并为用户提供了一个轻量级语法的选项。#light语法中的作用域由缩进给出。当你习惯了它,它是非常好的:-)
let z = (let x = 3 + 3 in x * x)