2010-08-03 65 views
6

我剛剛開始使用F#,當玩弄操作符重載時,我遇到了一些我不太明白的東西。現在,我明白你不能使用例如+*作爲重載前綴運算符;它只能是一箇中綴操作符。此處,我感到困惑,但是:F#操作符/函數混淆

let (+*) a = a + a * a;; 

如果我運行此,FSI告訴我,功能(+*)int->int。太好了,我可以挖掘它 - 它不是一個重載操作符,只是一個名爲(+*)的正常函數。所以,如果我這樣做:

printf "%d" ((+*) 6) 

我會得到42,因爲我期望。但是,如果我嘗試:

printf "%d" (+*) 6 
or 
printf "%d" (+*)6 

它不會編譯。我現在無法將確切的錯誤提出來,因爲此時我無法訪問F#編譯器,但爲什麼會這樣呢?這裏的綁定發生了什麼?

回答

7

它解釋本:

printf "%d" (+*) 6 

像這樣:

printf ("%d") (+*) (6) 

換句話說,傳遞三個咖喱參數printf,其中第二個是向功能+*的引用。

+0

啊,這是有道理的。但是,參數的間隔語法看起來好像會使綁定混淆。以什麼順序將空間綁定參數?我習慣於帶有強制括號參數的類C語言,所以這種綁定對我來說顯而易見。 – Perrako 2010-08-03 00:55:23

+0

Perrako,這是一個很好的後續問題。將它作爲一個單獨的問題發佈,以便我們對未來有一個參考(例如,「當我習慣C類參數時,如何習慣F#參數傳遞語法?」)。 (我很抱歉,我無法回答自己;我在F#之前學習了Lisp,所以我習慣了這種空間語法。) – 2010-08-03 04:07:26

+0

沒關係,我發現這個問題可能會回答你的問題:http:// stackoverflow .com/questions/2725202/f-function-calling-syntax-confusion – 2010-08-03 04:18:47