gpt4 book ai didi

f# - 那么 F# 中的一切都是表达式吗?

转载 作者:行者123 更新时间:2023-12-01 07:42:28 25 4
gpt4 key购买 nike

我正在查看以下 F# 行

for i = 0 to i=10 do
Console.WriteLine("Hello")

我想知道上面这行不是语句而不是表达式吗?

在 F# 中,一切都不应该是一个表达式吗?

最佳答案

如前所述,F# 中的每个句法结构都是一个表达式。 F# 不区分语句和表达式(所以我想说 Robert 发布的 WikiPedia 引用有点误导 - F# 没有语句)。

实际上,上述并不完全正确,因为 F# 计算表达式中的某些构造(例如 let!)不是表达式,但我们可以忽略它。

这意味着什么?在 C# 中,for 和方法调用的语法定义如下:

statement  := foreach(var v in <expression>) <statement>
| { <statement> ... <statement> }
| <expression>;
| (...)

expression := <expression>.<ident>(<expression>, ..., <expression>)
| <literal>
| <expression> + <expression>
| (...)

这是非常简化的,但它应该给你一个想法 - 一个语句是不评估为值的东西。它可以是 foreach 循环(其他循环)、语句块(带有多个语句)或带有分号的表达式(其中表达式的结果是 void 或被忽略)。例如,表达式是方法调用、原始文字(字符串、整数)或二元运算符。

这意味着您不能在 C# 中编写某些东西 - 例如,方法调用的参数不能是语句(因为语句不会评估为值!)

另一方面,在 F# 中,一切都是表达式。这意味着只有一个语法类别:
expression := for v in <expression> do <expression>
| <expression>; <expression>
| <expression>.<ident>(<expression>, ..., <expression>)
| <literal>
| <expression> + <expression>
| (...)

这意味着在 F# 中,所有句法结构都是表达式,包括 for 和其他循环。 for 的主体也是一个表达式,但如果表达式计算为某个值(即 42 )则没有意义,因此类型要求主体的结果是 unit (它不携带任何信息)。同样,排序中的第一个表达式 ( <expr>; <expr> ) 应该返回 unit - 排序的结果是第二个表达式的结果。

这使得语言更简单、更统一,但你可以写一些奇怪的东西:
let x = (for i in 0 .. 10 do printfn "%d" i); 42

这会将数字从 0 打印到 10 ,然后将值 x 定义为 42 。赋值是一个表达式序列 ( <expr>; <expr> ),其中第一个是 for 循环(它的类型是 unit ,因为它不计算任何值),第二个是 42 ,它的计算结果为 42。

关于f# - 那么 F# 中的一切都是表达式吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11288257/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com