2010-03-09 8 views
7

Je vous écris mon code comme si ceux-ci sont la même chose, et ne pas avoir des problèmes, mais il commence à me confondre quand je passe la souris sur une fonction dans Visual Studio et voir que les définitions de type contiennent 3 types différents que j'avais la pensée était la même. Sont-ils les mêmes? Ou sont-ils différents?Est-ce que float array, float [] et double [] sont différents ou identiques?

+0

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

Répondre

11

Ils sont les mêmes. Voir les abréviations de type au bas de la documentation FSharp.Core. Et array<'T> = 'T[]. Vous pouvez également définir vos propres abréviations de type et de les utiliser de la même façon:

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

Vous ne demandez pas à ce sujet, mais notez que le seul endroit où les abréviations de type ne fonctionnent pas tout à fait comme vous attendez est la mesure les types; float<_> est défini indépendamment de float, double, et System.Double, et il n'y a pas de double<_> correspondant ou System.Double<_>.

+0

ok, merci kvb ... –

7

En plus de saisir les abréviations, il y a deux choses utiles à savoir sur F types de #. Tout d'abord, il existe deux façons d'écrire des noms de types génériques. Une façon est d'utiliser la syntaxe OCaml et la seconde est d'utiliser la syntaxe .NET:

  • Lorsque vous utilisez la syntaxe .NET, vous écrivez array<'T> ou par exemple OtherType<'T1, 'T2> (pour les types avec plus d'un paramètre de type générique) .
  • Dans la syntaxe OCaml, la même chose est écrit 'T array ou ('T1, 'T2) OtherType

Ces deux notations sont équivalentes - lorsque vous déclarez une valeur de type annotée en utilisant la syntaxe .NET, vous pouvez l'affecter à une valeur annoté en utilisant la syntaxe OCaml. 'T[] est une notation spéciale pour les tableaux, mais cela explique pourquoi array<'T> est le même que 'T array. La deuxième chose est que F # utilise une dénomination un peu malheureuse pour les types de nombres à virgule flottante. Ceci est probablement dû à la compatibilité avec OCaml, mais il peut facilement confondre les programmeurs .NET:

  • F # flotteur de type correspond à System.Double dans .NET (qui est appelé double en C#)
  • F # float32 correspond bien à System.Single dans .NET (qui est appelé float en C#)

Comme @kvb souligne, deux est une autre t ype alias pour le type System.Double.

+1

Bien sûr, il y a aussi l'abréviation 'single', qui est aussi synonyme de' float32' . Et 'int = int32 = System.Int32', et' int8 = sbyte = System.SByte', etc. – kvb