我周圍的F#有點今天打的,寫了這個:爲什麼不可能對不同類型的參數使用相同的函數兩次?
let sq x = x * x
let i = sq 3
let d = sq 3.0
如果刪除第三或第四行,但如果兩者都存在它編譯。我收到錯誤This expression should have type 'int', but has type 'float'
。
我周圍的F#有點今天打的,寫了這個:爲什麼不可能對不同類型的參數使用相同的函數兩次?
let sq x = x * x
let i = sq 3
let d = sq 3.0
如果刪除第三或第四行,但如果兩者都存在它編譯。我收到錯誤This expression should have type 'int', but has type 'float'
。
的類型推斷的工作,使你的函數sq
的類型爲int -> int
,因爲第一次編譯器看到你使用該功能,你傳遞一個整數。所以它假設sq
是一個接受整數的函數,並且通過函數的定義(x * x
)它也返回一個整數。
這是一個有點複雜的定義在F#完全通用的計算功能,但這樣做的一種方法是使功能inline
,就像這樣:
let inline sq x = x * x
這樣你的函數體將每次在呼叫站點內聯,因此使用內聯sq
函數將與每次使用時替換它的正文相同。
這種方法有它的缺點,我認爲你會看到this question會很有趣。
默認功能let sq x = x * x
的類型爲int -> int
。
如果將其放在let d = sq 3.0
的上下文中,F#編譯器會將其類型推斷爲float -> float
。
無論如何,該函數只能有一個類型簽名,可以是int->int
或float->float
。
這是如何實現綁定的限制。有兩種選擇。
首先,將內聯添加到聲明中。
其次,使用類中的成員綁定並覆蓋不同的類型。
讓限制函數不能重載。在您的具體情況下,您可以使用inline
,它在編譯時內聯函數體,因此可以選擇合適的*
實現,例如,
let inline sq x = x * x
其他答案是正確的,但他們忽略了拼圖的重要部分:在F#中,例如int和float之間沒有隱式轉換。這就是爲什麼你的第二次調用實際上是用一個float參數調用一個不存在的重載。
所有答案都正確(+1),據我所知,儘管我從你那裏學到的東西最多。 –