2016-09-15 207 views
3

我一直認爲類型float32single是可以互換的,因爲它們是類型別名。對於floatdouble也是如此。但是,它們似乎在不同的程序集Microsoft.FSharp.Core.OperatorsMicrosoft.FSharp.Core.ExtraTopLevelOperators中聲明。float32 vs single和float與double有什麼區別?

此外,彈出式說明略有不同,其中F#在float32float上表示可以採用字符串並使用Parse()

但是,試圖與singledouble成功就好過:

let x = single "12.3" 
let y = double "13.4" 

有沒有我應該知道的有什麼區別?我一直用他們互換,從來沒有真正賦予它另一個想法,直到我看到彈出窗口和簽名的區別:他們都只是相應的CLR類型的別名,你可以在prim-types-prelude.fs看到

// on hovering, or in FSI, this will have the slightly confusing signature: 
// val x: a: double -> float 
let x (a: double) = float a 
+0

'System.Object.ReferenceEquals(typeof ,typeof );; System.Object.ReferenceEquals(typeof ,typeof );;' – PetSerAl

+0

@PetSerAl:如果它們在引用上相同(您的建議有意義且確實相同),那麼如何解釋它們在UI中的差異以及集?或者,那只是F#玩弄心靈招數? – Abel

回答

3

對於混亂的簽名可以這樣考慮:

type typA = A;; 

type typB = typA;; 

let f (x : typA) = (x : typB) 
//val f : x:typA -> typB 

好像F#喜歡你(或其他一些定義)用它們的場所使用的別名。

最後你指的是(FSharp.Core.Operators)的命名空間指的並不是的float類型,但是float功能float : 'T -> float)。請參閱prim-types.fs

+0

感謝您的指點。你說得對,'ExtraTopLevelOperators'當然是功能。我錯誤地認爲這是類型的位置。仍然奇怪的是,功能位置不同,並有不同的工具提示,但行爲相同(只要我可以告訴)。 – Abel

相關問題