【问题标题】:What is the "let" keyword in functional languages like F# and OCaml for?F# 和 OCaml 等函数式语言中的“let”关键字是干什么用的?
【发布时间】:2010-05-16 14:12:02
【问题描述】:

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

  • 为什么需要它?为什么要设计这些语言?
  • 你为什么不能把它排除在外?例如:让 x=4 变成 x=4

【问题讨论】:

    标签: f# ocaml functional-programming


    【解决方案1】:

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

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

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

    声明函数 - 你也可以用它来声明函数。在这种情况下,您指定一个符号是一个具有一定数量的函数:

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

    为什么需要它?在 F# 中,如果没有它,代码会很模糊。您可以使用 value hidden 创建隐藏前一个符号(具有相同名称)的新符号,例如以下返回 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)将值绑定编写为另一个表达式的一部分:

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

    在这里,z 的值将是 36。虽然您可以发明一些不需要 let 关键字的语法,但我认为使用 let 只会使代码更具可读性。

    【讨论】:

    • 好像是因为x = y不明确才引入let?如果== 用于比较,那么let 是否变得不必要?
    • @KennyTM:原则上,您绝对可以发明一些明确的语法,但我认为let 的可读性很强。此外,在完整的语法中,letin 结合在一起(因为它是一个表达式 - F# 中没有语句),所以你需要类似的东西。
    • 当我在 F# 中看到 let w/out in 时,我不寒而栗……作为一名 ocaml 程序员,我看到 in 在可读性和格式方面有很大帮助。为什么 F# 程序员很少使用它?
    • @nlucaroni 您可以通过在文件开头省略“#light”选项来使用 F# 中的 OCaml 'in' 语法。 F# 设计师认为 ocaml 语法有点冗长,并为用户提供了使用 #light-er 的选项。 #light 语法中的范围由缩进给出。当你习惯它时,它非常好:-)
    【解决方案2】:

    “let”的主要目的是为其定义设置一个范围。

    let <definitions> in <expression>

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

    【讨论】:

      【解决方案3】:

      “let”引入了一个新的变量范围,并允许您将变量绑定到该范围的值。它通常被读作“让 x 成为 [value] in ...”。当你没有赋值时,避免变量名冲突是非常有用的。

      【讨论】:

        【解决方案4】:

        在 Haskell 中,

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

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

        【讨论】:

        • 但是在 F# 中你需要写 let foo = ... 即使是非局部变量。
        【解决方案5】:

        let 的意思是“将值绑定到名称”,一般来说,创建一个新变量。 x = 4 表示“将 4 分配给 x”,它不会创建新名称。

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

        【讨论】:

        • 可能是来自 Lisp 的传统语言,它们通常不使用 = 和中缀语法。
        • 实际上在 F# 和 ocaml 中x = 4 是一个布尔运算,当 x 等于 4 时返回 true。这不是赋值。
        【解决方案6】:

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

        【讨论】:

          猜你喜欢
          • 2011-05-30
          • 2019-05-09
          • 1970-01-01
          • 1970-01-01
          • 2011-03-11
          • 2016-12-17
          • 2011-11-23
          • 2011-01-15
          • 1970-01-01
          相关资源
          最近更新 更多