簡體   English   中英

F#中的類型推斷

[英]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_Inferencehttp://en.wikibooks.org/wiki/F_Sharp_Programming/Values_and_Functions

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM