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

标签 f# ocaml functional-programming

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

  • 你为什么需要它?为什么设计语言具有它?
  • 你为什么不能把它放在外面?例如:让 x=4 变为 x=4
  • 最佳答案

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

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

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

    声明函数 - 你也可以用它来声明函数。在这种情况下,您指定一个符号是一个具有一定数量的函数:
    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 )将值绑定(bind)编写为另一个表达式的一部分:
    let z = (let x = 3 + 3 in x * x)
    

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

    关于f# - F# 和 OCaml 等函数式语言中的 "let"关键字有什么用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2844047/

    相关文章:

    scala - 如何在不使用可变变量的情况下在 Scala 中编写迭代器?

    oop - 内部和私有(private)有什么区别

    list - Ocaml,用列表中的给定元素替换所有指定元素

    ocaml - 让 rec 获取值,让 rec 获取 ocaml 中的函数

    clojure - 是否可以将一个函数的结果作为输入传递给 Clojure 中的两个函数?

    function - 将可选回调传递给 Swift 函数

    f# - 从 IHostingEnvironment 迁移到 IWebHostEnvironment

    f# - 为什么 Akka.Net F# API 定义了 actorOf2 而不是 actorOf3、actorOf4 等?

    linux - Monodevelop 上的 F# : compiler doesn't understand valid Linux file path

    exception - 如何在 Ocaml 的 float 类型中表示空值