2010-03-09 11 views
7

Piszę mój kod tak, jakby były to te same rzeczy, i nie ma problemów, ale zaczyna mnie mylić, gdy unoszą się nad funkcją w Visual Studio i zobacz, że definicje typów zawierają 3 różne typy, które miałem myśl była taka sama. Czy oni są tacy sami? Czy są one różne?Czy tablica float, float [] i double [] są różne lub takie same?

+0

http://msdn.microsoft.com/en-us/library/dd233193.aspx –

Odpowiedz

11

Są takie same. Zobacz skróty typów u dołu dokumentacji FSharp.Core. float = double = System.Double i array<'T> = 'T[]. Można również zdefiniować własne skróty typu i korzystać z nich w ten sam sposób:

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

Nie pytałem o to, ale należy pamiętać, że jedynym miejscem, gdzie typ skróty mogą nie działać zupełnie jak można się spodziewać jest miarą typy; float<_> jest zdefiniowany niezależnie od float, double i System.Double i nie ma czegoś takiego jak odpowiadający double<_> lub System.Double<_>.

+0

ok, dzięki kvb ... –

7

Oprócz skrótów typu, istnieją dwie przydatne rzeczy, które należy wiedzieć o typach F #. Przede wszystkim istnieją dwa sposoby na wpisanie nazw rodzajów ogólnych. Jednym ze sposobów jest użycie składni SML i drugi sposób polega na użyciu składni .NET:

  • Przy użyciu składni .NET, piszesz array<'T> lub na przykład OtherType<'T1, 'T2> (dla typów z więcej niż jednego parametru typu rodzajowego) .
  • W składni OCaml, to samo jest napisane jak 'T array lub ('T1, 'T2) OtherType

Te dwa zapisy są równoważne - jeśli zadeklarować wartość typu uwagami przy użyciu składni .NET, można przypisać je do wartości adnotowane przy użyciu składni OCaml. 'T[] to specjalne oznaczenia dla tablic, ale to wyjaśnia, dlaczego array<'T> jest takie samo jak 'T array.

Drugą rzeczą jest to, że F # używa nieco niefortunnego nazewnictwa dla liczb zmiennoprzecinkowych. Jest to prawdopodobnie ze względu na kompatybilność z SML, ale można go łatwo pomylić programistów .NET:

  • F # pływak znamionowej odpowiada System.Double w .NET (który jest nazywany double w C#)
  • F # float32 typu odpowiada System.Single w NET (który nazywa float C#)

jako @kvb wskazuje dwukrotnie inny t ype alias dla typu System.Double.

+1

Oczywiście istnieje również skrót "single", który jest również synonimem 'float32' . Oraz 'int = int32 = System.Int32' i' int8 = sbyte = System.SByte', itp. – kvb

Powiązane problemy