【发布时间】:2010-05-16 14:12:02
【问题描述】:
在查看 F#、Ocaml 和其他函数式语言代码示例时,我注意到 let 关键字的使用非常频繁。
- 为什么需要它?为什么要设计这些语言?
- 你为什么不能把它排除在外?例如:让 x=4 变成 x=4
【问题讨论】:
标签: f# ocaml functional-programming
在查看 F#、Ocaml 和其他函数式语言代码示例时,我注意到 let 关键字的使用非常频繁。
【问题讨论】:
标签: f# ocaml functional-programming
在 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 是否变得不必要?
let 的可读性很强。此外,在完整的语法中,let 与 in 结合在一起(因为它是一个表达式 - F# 中没有语句),所以你需要类似的东西。
let w/out in 时,我不寒而栗……作为一名 ocaml 程序员,我看到 in 在可读性和格式方面有很大帮助。为什么 F# 程序员很少使用它?
“let”的主要目的是为其定义设置一个范围。
let <definitions> in <expression>
确保定义不会污染除<expression> 之外的任何名称空间。
【讨论】:
“let”引入了一个新的变量范围,并允许您将变量绑定到该范围的值。它通常被读作“让 x 成为 [value] in ...”。当你没有赋值时,避免变量名冲突是非常有用的。
【讨论】:
在 Haskell 中,
foo = let x = 5
y = 7
in z=x+y
用于明确 x 和 y 是 foo 的“私有”变量。
【讨论】:
let foo = ... 即使是非局部变量。
let 的意思是“将值绑定到名称”,一般来说,创建一个新变量。
x = 4 表示“将 4 分配给 x”,它不会创建新名称。
【讨论】:
= 和中缀语法。
x = 4 是一个布尔运算,当 x 等于 4 时返回 true。这不是赋值。
如果您正在学习,this lecture 也可能是相关的,尤其是。关于评估 let 术语的部分。
【讨论】: