2010-03-09 23 views
7

Escribo mi código como si todo fuera lo mismo y no tuviera problemas, pero está empezando a confundirme cuando controlo una función en Visual Studio y veo que las definiciones de tipo contienen 3 tipos diferentes que tenía. el pensamiento era todo lo mismo. ¿Son lo mismo? ¿O son diferentes?¿Son flotantes, flotantes [] y dobles [] diferentes, o lo mismo?

+0

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

Respuesta

11

Son lo mismo. Consulte las abreviaturas de tipo en la parte inferior de la documentación FSharp.Core. float = double = System.Double y array<'T> = 'T[]. También puede definir sus propias abreviaturas tipo y utilizar de la misma manera:

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

usted no pidió al respecto, pero tenga en cuenta que el único lugar en el tipo abreviaturas podrían no funcionar bien como cabría esperar es medida tipos; float<_> se define independientemente de float, double y System.Double, y no existe la correspondiente double<_> o System.Double<_>.

+0

ok, gracias kvb ... –

7

Además de escribir abreviaturas, hay dos cosas útiles que debe saber sobre los tipos de F #. En primer lugar, hay dos formas de escribir nombres de tipos genéricos. Una forma es utilizar la sintaxis OCaml y la segunda forma es utilizar la sintaxis .NET:

  • Al utilizar la sintaxis de .NET, se escribe array<'T> o, por ejemplo OtherType<'T1, 'T2> (para los tipos con más de un parámetro de tipo genérico) .
  • En la sintaxis OCaml, lo mismo se escribe como 'T array o ('T1, 'T2) OtherType

Estos dos notaciones son equivalentes - cuando se declara un valor de tipo anotada usando la sintaxis NET, puede asignarlo a un valor anotado usando la sintaxis OCaml. 'T[] es una nota especial para las matrices, pero esto explica por qué array<'T> es lo mismo que 'T array.

Lo segundo es que F # usa un nombre un poco desafortunado para los tipos de números de coma flotante. Esto es probablemente debido a la compatibilidad con OCaml, pero puede confundir fácilmente programadores .NET:

  • F # flotador tipo corresponde a System.Double en .NET (que se llama double en C#)
  • F # float32 tipo corresponde a System.Single en .NET (que se llama float en C#)

Como @kvb señala, doble es otra t ype alias para el tipo System.Double.

+1

Por supuesto, también está la abreviatura 'single', que también es sinónimo de' float32' . Y 'int = int32 = System.Int32', y' int8 = sbyte = System.SByte', etc. – kvb