2016-09-15 2419 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

相关问题