我正在编写我的代码,好像这些都是一样的,没有任何问题,但是当我将鼠标悬停在Visual Studio中的某个函数上并看到类型定义包含3种不同的类型时,它开始让我感到困惑曾经想过都是一样的。它们是一样的吗?还是他们不一样?
答案 0 :(得分:12)
他们是一样的。请参阅FSharp.Core文档底部的类型缩写。 float = double = System.Double
和array<'T> = 'T[]
。您还可以定义自己的类型缩写并以相同的方式使用它们:
type dbl = double
let (d:dbl) = 1.0
你没有问过这个问题,但请注意,类型缩写可能不会像你期望的那样工作的地方是度量类型; float<_>
的定义与float
,double
和System.Double
无关,并且没有相应的double<_>
或System.Double<_>
。
答案 1 :(得分:7)
除了类型缩写外,还有两个有关F#类型的有用信息。首先,有两种方法可以编写泛型类型的名称。一种方法是使用OCaml语法,第二种方法是使用.NET语法:
array<'T>
或OtherType<'T1, 'T2>
(对于具有多个泛型类型参数的类型)。'T array
或('T1, 'T2) OtherType
这两个表示法是等效的 - 当您使用.NET语法声明注释类型的值时,可以将其分配给使用OCaml语法注释的值。 'T[]
是数组的特殊符号,但这解释了为什么array<'T>
与'T array
相同。
第二件事是F#对浮点数类型使用了一点不幸的命名。这可能是由于与OCaml的兼容性,但它很容易让.NET程序员感到困惑:
System.Double
(在C#中称为double
)System.Single
(在C#中称为float
)正如@kvb指出的那样, double 是System.Double
类型的另一种类型别名。