2010-03-09 15 views
7

Sto scrivendo il mio codice come se fossero tutti la stessa cosa, e non avendo problemi, ma sta iniziando a confondermi quando passo il mouse su una funzione in Visual Studio e vedo che le definizioni del tipo contengono 3 tipi diversi che ho avuto il pensiero era lo stesso. Sono gli stessi? O sono diversi?Gli array float, float [] e double [] diversi, o lo stesso?

+0

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

risposta

11

Sono uguali. Vedere le abbreviazioni di tipo nella parte inferiore della documentazione FSharp.Core. float = double = System.Double e array<'T> = 'T[]. È inoltre possibile definire un tipo abbreviazioni e li usa allo stesso modo:

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

non hai chiesto a questo proposito, ma nota che l'unico posto dove tipo abbreviazioni potrebbero non funzionare del tutto come ci si aspetterebbe è misura tipi; float<_> viene definito indipendentemente da float, double e System.Double e non esiste una corrispondenza corrispondente a double<_> o System.Double<_>.

+0

ok, grazie kvb ... –

7

Oltre a digitare le abbreviazioni, ci sono due cose utili da sapere sui tipi di F #. Prima di tutto, ci sono due modi per scrivere nomi di tipi generici. Un modo è quello di utilizzare la sintassi OCaml e il secondo modo è quello di utilizzare la sintassi .NET:

  • Quando si usa la sintassi .NET, si scrive array<'T> o per esempio OtherType<'T1, 'T2> (per i tipi con più di un parametro di tipo generico) .
  • Nella sintassi OCaml, la stessa cosa è scritto come 'T array o ('T1, 'T2) OtherType

Queste due notazioni sono equivalenti - quando si dichiara un valore di tipo annotato utilizzando la sintassi .NET, è possibile assegnare a un valore annotato usando la sintassi OCaml. 'T[] è una notazione speciale per gli array, ma questo spiega perché array<'T> è uguale a 'T array.

La seconda cosa è che F # utilizza un nome un po 'sfortunato per i tipi di numeri in virgola mobile. Ciò è probabilmente dovuto alla compatibilità con OCaml, ma può facilmente confondere i programmatori NET:

  • F # galleggiante tipo corrisponde a System.Double NET (che è chiamato double in C#)
  • F # float32 corrisponda a System.Single NET (che è chiamato float in C#)

Come @kvb sottolinea, doppio è un'altra t alias yype per il tipo System.Double.

+1

Naturalmente, c'è anche l'abbreviazione 'single', che è anche sinonimo di' float32' . E 'int = int32 = System.Int32', e' int8 = sbyte = System.SByte', ecc. – kvb