2013-07-20 61 views

回答

6

的類型推斷的工作,使你的函數sq的類型爲int -> int,因爲第一次編譯器看到你使用該功能,你傳遞一個整數。所以它假設sq是一個接受整數的函數,並且通過函數的定義(x * x)它也返回一個整數。

這是一個有點複雜的定義在F#完全通用的計算功能,但這樣做的一種方法是使功能inline,就像這樣:

let inline sq x = x * x 

這樣你的函數體將每次在呼叫站點內聯,因此使用內聯sq函數將與每次使用時替換它的正文相同。

這種方法有它的缺點,我認爲你會看到this question會很有趣。

+0

所有答案都正確(+1),據我所知,儘管我從你那裏學到的東西最多。 –

1

默認功能let sq x = x * x的類型爲int -> int

如果將其放在let d = sq 3.0的上下文中,F#編譯器會將其類型推斷爲float -> float

無論如何,該函數只能有一個類型簽名,可以是int->intfloat->float

1

這是如何實現綁定的限制。有兩種選擇。

首先,將內聯添加到聲明中。

其次,使用類中的成員綁定並覆蓋不同的類型。

2

讓限制函數不能重載。在您的具體情況下,您可以使用inline,它在編譯時內聯函數體,因此可以選擇合適的*實現,例如,

let inline sq x = x * x 
2

其他答案是正確的,但他們忽略了拼圖的重要部分:在F#中,例如int和float之間沒有隱式轉換。這就是爲什麼你的第二次調用實際上是用一個float參數調用一個不存在的重載。

相關問題