2017-06-01 30 views
2

我正在學習f#,並且我明白在調用函數時不需要使用括號。何時在f#中調用函數時使用括號?

防爆

let addOne arg1 = 
    arg1 + 1 

addOne 1 

VS

this.GetType() 

我爲什麼一定要在第二功能使用括號?

+2

[F#中括號的使用]可能的重複(https://stackoverflow.com/questions/8222759/usage-of-parenthesis-in-f) – clcto

回答

8

有一點與.NET庫的工作,並與F#庫工作,當涉及到參數不匹配的,但你通常可以看到()沒有括號,但作爲unit類型的一個特殊值,意味着「不有用的信息」。

這意味着,當你說:

addOne 1 

要調用addOne與價值 - 數字1 - 作爲參數。現在,當你應用相同的閱讀第二個例子:

this.GetType() 

你可以看這是調用this.GetType與價值 - 特殊()單元值作爲參數。如果你想保持一致,你可以用空間寫這太:

this.GetType() 

在實踐中,大多數人會調用.NET庫時省略了空間。當你不寫空格時,F#也支持方法鏈接,所以你可以編寫例如foo().bar()

許多采用多個參數的F#函數將使用「curried」形式,這意味着參數需要用空格分隔。例如:

let add a b = a + b 
let mul a b = a * b 

add 10 (mul 20 3) 

這裏,你需要圍繞第二個表達式,因此編譯器知道如何解析代碼。這與典型的.NET方法相反,後者將參數作爲元組來使用。 F#元組寫成(10, "hello"),所以你可以看到一個方法調用作爲一個普通的呼叫接受一個元組:

some.Operation (10, "Hello") 

同樣,通常你不會在這裏寫的空間,因爲你知道這其實是一個.NET方法調用,而不是「將元組傳遞給函數」,但從概念上講,可以用兩種方式來思考。

這是總結 - 有幾個角落的情況下,方法調用實際上並不像元組(例如,當涉及到命名參數時),但是這種思考方式應該讓你知道事情是如何工作的。

+1

我只想到它將元組作爲參數傳遞,因爲不僅在概念上,而且在技術上也是這樣,在大多數情況下,它就是門面。只有幕後纔是。爲了證明這一點,您可以在單獨的「let」語句中創建參數 - 元組,即在下一步中使用元組的標識符作爲函數或方法的參數。我已經發現了這個非常方便的幾次,絕對是你不能在C#中使用的技巧。 –

+1

托馬斯,這個問題只是冰山一角,或者是大象的一條腿。幾乎每個新來的人都在這些問題上磕磕絆絆,而且看不到大局。有人應該寫一篇文章解釋關於爭論,捲曲,元組和單位 - 它們是如何相互關聯的 - 並將其張貼在顯眼的地方。 –

相關問題