我在看下面的F#線那麼,F#中的所有表達式都是?
for i = 0 to i=10 do
Console.WriteLine("Hello")
的我不知道,是不是上面的線,而不是一個表達式語句?
不應該都是F#中的表達式嗎?
我在看下面的F#線那麼,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#中的每條語句(包括if語句和循環)都是具有確定返回類型的 可組合表達式。 不返回任何值的函數和表達式返回 單位的類型。
IIRC,在這段代碼個Console.WriteLine'(「你好」)的返回值'將是void'的'F#的當量,而在for循環的返回值將是它的值是最後一個表達式(再次,' void'在這種情況下) –
所以你可以這樣做:'Console.WriteLine(for i = 0 to i = 10 do foo(i))'?哪個不會打印什麼。除了foo(i)'副作用。 – leppie
@leppie - 代碼應該是'Console.WriteLine(對於i = 0到10做foo(i))',但在其他方面是正確的。 –
在語言像F#語句只是表達式返回值()
類型unit
。由於unit
類型只有一個值,因此它不傳遞任何信息,因此返回類型單元的值說「如果我做了任何事情,那麼它是通過副作用的方式」,如打印到控制檯或寫入磁盤。
請注意,並非一切都在F#的表達式。類型定義不是表達式。模式不是表達式。等等...
你是如何定義的話「聲明」和「表達」? –