那么一切都是用F#表示的吗?

那么一切都是用F#表示的吗?,f#,unit-type,F#,Unit Type,我正在看下面的F线 a我想知道,上面这一行不是一个语句,而不是一个表达式吗 一切不都应该用F#表示吗 F#中的每个语句,包括if语句和循环,都是一个 具有确定返回类型的可组合表达式。 不返回任何值的函数和表达式具有返回值 单位类型 如前所述,F#中的每个句法结构都是一个表达式。F#不区分陈述和表达(因此我要说,罗伯特发布的维基百科引用有点误导——F#没有陈述) 事实上,上述情况并不完全正确,因为F#计算表达式中的一些构造,如let不是表达式,但我们可以忽略它 这是什么意思?在C#中,用于和方法调

我正在看下面的F线

a我想知道,上面这一行不是一个语句,而不是一个表达式吗

一切不都应该用F#表示吗

F#中的每个语句,包括if语句和循环,都是一个 具有确定返回类型的可组合表达式。 不返回任何值的函数和表达式具有返回值 单位类型


如前所述,F#中的每个句法结构都是一个表达式。F#不区分陈述和表达(因此我要说,罗伯特发布的维基百科引用有点误导——F#没有陈述)

事实上,上述情况并不完全正确,因为F#计算表达式中的一些构造,如
let不是表达式,但我们可以忽略它

这是什么意思?在C#中,用于
和方法调用的
语法定义如下:

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

expression := <expression>.<ident>(<expression>, ..., <expression>)
            | <literal>
            | <expression> + <expression>
            | (...)
这意味着在F#中,所有语法结构都是表达式,包括
和其他循环。
for
的主体也是一个表达式,但如果表达式计算为某个值(即
42
),则没有意义,因此类型要求主体的结果为
单位
(不携带任何信息)。类似地,排序中的第一个表达式(
)应该返回
单位
——排序的结果是第二个表达式的结果

这使语言更简单、更统一,但您可以编写一些奇怪的东西:

let x = (for i in 0 .. 10 do printfn "%d" i); 42
这将打印从
0
10
的数字,然后将值
x
定义为
42
。赋值是一个表达式序列(
),其中第一个是
for
循环(它有一个类型
单元,因为它不计算任何值),第二个是
42
,它的计算值为42。在F#等语言中,语句只是返回值
()
类型
装置
。由于
单元
类型只有一个值,因此它不传递任何信息,因此返回type unit的值表示“如果我正在做任何事情,那么这是通过副作用实现的”,如打印到控制台或写入磁盘


请注意,并非所有内容都是F#中的表达式。类型定义不是表达式。模式不是表达式。等等……

如何定义“语句”和“表达式”?IIRC,在这段代码中,
控制台的返回值。WriteLine(“Hello”)
将是
void
的F#等价物,for循环的返回值将是它的最后一个表达式的值(在这种情况下,
void
)所以您可以这样做:
Console.WriteLine(对于i=0到i=10的dofoo(i))
?不会打印任何内容。除了
foo(i)
副作用之外。@leppie-代码应该是
Console.WriteLine(对于i=0到10的do-foo(i))
,但在其他方面是正确的。@JohnPalmer:谢谢,我刚才是从上面复制/粘贴的;p“F#中的每个句法结构都是一个表达式”。模式是一个明显的反例。
expression := for v in <expression> do <expression>
            | <expression>; <expression>
            | <expression>.<ident>(<expression>, ..., <expression>)
            | <literal>
            | <expression> + <expression>
            | (...)
let x = (for i in 0 .. 10 do printfn "%d" i); 42