float数组,float []和double []是不同的,还是相同的?

fs_*_*ech 7 f#

我正在编写我的代码,好像这些都是一样的,并且没有任何问题,但是当我将鼠标悬停在Visual Studio中的某个函数上并且看到类型定义包含我认为的3种不同类型时,它开始让我感到困惑全都一样.它们是一样的吗?还是他们不一样?

kvb*_*kvb 12

他们是一样的.请参阅FSharp.Core文档底部的类型缩写. float = double = System.Doublearray<'T> = 'T[].您还可以定义自己的类型缩写并以相同的方式使用它们:

type dbl = double
let (d:dbl) = 1.0
Run Code Online (Sandbox Code Playgroud)

你没有问过这个问题,但是请注意,类型缩写可能不会像你期望的那样工作的地方是度量类型; float<_>是独立于float,double和的定义System.Double,并且没有相应的double<_>或者System.Double<_>.


Tom*_*cek 7

除了类型缩写之外,还有两个有关F#类型的有用信息.首先,有两种方法可以编写泛型类型的名称.一种方法是使用OCaml语法,第二种方法是使用.NET语法:

  • 使用.NET语法时,您可以编写array<'T>或例如OtherType<'T1, 'T2>(对于具有多个泛型类型参数的类型).
  • 在OCaml语法中,同样的东西写成'T array('T1, 'T2) OtherType

这两个表示法是等效的 - 当您使用.NET语法声明注释类型的值时,可以将其分配给使用OCaml语法注释的值.'T[]是数组的特殊符号,但这解释了为什么array<'T>是相同的'T array.

第二件事是F#对浮点数类型使用了一点不幸的命名.这可能是由于与OCaml的兼容性,但它很容易混淆.NET程序员:

  • F#float类型对应System.Double于.NET(double在C#中调用)
  • F#float32类型对应System.Single于.NET(float在C#中调用)

正如@kvb指出的那样,double是该System.Double类型的另一种类型别名.