什么是「;让我们;函数语言中的关键字,如F#和OCaml for?

什么是「;让我们;函数语言中的关键字,如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成为……中的

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

  • 你为什么需要它?为什么这些语言被设计成拥有它
  • 你为什么不能把它删掉?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#和ocaml
      x=4中,都是一个布尔运算,返回真正的iff x等于4。这不是赋值。似乎引入
      let
      只是因为
      x=y
      不明确?如果使用
      =
      进行比较,那么
      let
      是否就没有必要了?@KennyTM:原则上,你完全可以发明一些不含糊的语法,但我认为
      let
      非常可读。另外,在完整的语法中,
      let
      in
      (因为它是一个表达式-在F#中没有语句),所以您需要类似的东西。当我在F#中看到
      let
      w/out
      in
      时,我会发抖。。。作为一名ocaml程序员,我认为
      中的
      在可读性和格式方面有很大帮助。为什么F#程序员没有这么多地使用它?@nlucaroni您可以在F#中使用OCaml'in'语法,方法是省略文件开头的“#light”选项。F#设计者认为ocaml语法有点冗长,并为用户提供了一个轻量级语法的选项。#light语法中的作用域由缩进给出。当你习惯了它,它是非常好的:-)
      
      let z = (let x = 3 + 3 in x * x)