2012-07-02 30 views
3

我在看下面的F#線那麼,F#中的所有表達式都是?

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

的我不知道,是不是上面的線,而不是一個表達式語句?

不應該都是F#中的表達式嗎?

+1

你是如何定義的話「聲明」和「表達」? –

回答

8

正如已經說過的,在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 

這將打印從010號碼,然後定義值x42。分配是表達式的測序(<expr>; <expr>),其中第一個是for環(具有類型unit,因爲它不計算爲任何東西),第二個是42,其計算結果爲42

+0

「F#中的每個語法結構都是一個表達式」。模式是一個明顯的反例。 –

4

F#中的每條語句(包括if語句和循環)都是具有確定返回類型的 可組合表達式。 不返回任何值的函數和表達式返回 單位的類型。

http://en.wikipedia.org/wiki/F_Sharp_(programming_language)

+0

IIRC,在這段代碼個Console.WriteLine'(「你好」)的返回值'將是void'的'F#的當量,而在for循環的返回值將是它的值是最後一個表達式(再次,' void'在這種情況下) –

+0

所以你可以這樣做:'Console.WriteLine(for i = 0 to i = 10 do foo(i))'?哪個不會打印什麼。除了foo(i)'副作用。 – leppie

+1

@leppie - 代碼應該是'Console.WriteLine(對於i = 0到10做foo(i))',但在其他方面是正確的。 –

0

在語言像F#語句只是表達式返回值()類型unit。由於unit類型只有一個值,因此它不傳遞任何信息,因此返回類型單元的值說「如果我做了任何事情,那麼它是通過副作用的方式」,如打印到控制檯或寫入磁盤。

請注意,並非一切都在F#的表達式。類型定義不是表達式。模式不是表達式。等等...

相關問題