[英]type inference in F#
在F#中,為什么我的add函數不添加兩個浮點數
let add a b = a+b
(add 3 4) //returns 7
(add 3.5 5.5) //error
還請解釋F#中的類型推斷是如何工作的。
謝謝。
你必須使它內聯。
let inline add a b = a+b
問題是+
是一個內聯運算符,所以如果你的函數add不是內聯的,它將采用int的默認重載。
看看這個答案在F#中使用`inline`
當函數聲明為內聯時,類型推斷將推斷靜態類型約束。
val inline add :
^a -> ^b -> ^c
when ( ^a or ^b) : (static member ( + ) : ^a * ^b -> ^c)
所以現在a和b可以是用該簽名實現靜態成員(+)的任何類型。
如果您只希望函數與浮點數一起使用,請使用類型注釋。
let add (a:float) b = a + b //float -> float -> float
我的兩分錢在這里。
實際上,如果你改變執行的順序,
let add a b = a+b
(add 3.5 5.5) //returns 9.0
(add 3 4) //error
您將看到F#確實添加了兩個浮點數。 (這回答你的問題在F#為什么我的添加功能不添加兩個花車)
請注意,在這個片段中,F#將函數add type推斷為float - > float - > float。
為什么F#在兩種情況下推斷函數類型的方式不同,即使您以完全相同的方式定義函數?
我認為在定義函數時,F#給函數賦予int類型。 但在內部,F#仍然對該功能的“真實”類型保持靈活性。 您調用該函數的第一個時間/行,編譯器會看到您如何使用它,因此編譯器可以理解您對函數類型的“意圖”。 並且編譯器相應地調整類型。
一旦編譯器“認為”它獲得了函數的“真實類型”,它就是它的本質。 由於F#是靜態類型的,因此您無法使用不同類型的參數再次調用該函數。
話雖這么說,我建議你試試這些片段。
let add a b = a + b
add "str" "ing"
它應該工作。
let add a b = a + b
add 5. 6.
add "str" "ing" // error, check the type
如果我錯了,請糾正我。 希望這可以幫助。
在F#中,由於技術限制,類型推理系統在處理數字時只會放置一種int
類型。 在Haskell中, add :: Num a => a -> a -> a
因為類型類而起作用,這與.NET類不同。 類型不適合F#。
見http://en.wikibooks.org/wiki/F_Sharp_Programming/Basic_Concepts#Type_Inference和http://en.wikibooks.org/wiki/F_Sharp_Programming/Values_and_Functions
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.