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