我一直认为类型float32
和single
是可互换的,因为它们是类型别名。float
和double
也一样。然而,它们似乎是在不同的程序集Microsoft.FSharp.Core.Operators
和Microsoft.FSharp.Core.ExtraTopLevelOperators
中声明的。
另外,弹出描述也略有不同,f#在float32
和float
上说它可以接受字符串并使用Parse()
。
然而,尝试single
和double
也很成功:
let x = single "12.3"
let y = double "13.4"
有什么我应该注意的区别吗?我一直交替使用它们,从来没有真正考虑过它,直到我看到了弹出框和签名的区别:
// on hovering, or in FSI, this will have the slightly confusing signature:
// val x: a: double -> float
let x (a: double) = float a
它们都只是相应CLR类型的别名,您可以在prim-types-prelude.fs
中看到。
type float32 = System.Single
type float = System.Double
type single = System.Single
type double = System.Double
对于令人困惑的签名,请考虑如下:
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。