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

时间:2010-03-09 20:16:07

标签: f#

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

2 个答案:

答案 0 :(得分:12)

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

type dbl = double
let (d:dbl) = 1.0

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

答案 1 :(得分: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 类型对应于.NET中的System.Double(在C#中称为double
  • F# float32 类型对应于.NET中的System.Single(在C#中称为float

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