Compartir vía


Literales

En este artículo se proporciona una tabla que muestra cómo especificar el tipo de un literal en F#.

Tipos literales

En la tabla siguiente se muestran los tipos de literales de F#. Los caracteres que representan dígitos en notación hexadecimal no distinguen mayúsculas de minúsculas; los caracteres que identifican el tipo distinguen mayúsculas de minúsculas.

Tipo Descripción Sufijo o prefijo Ejemplos
sbyte entero de 8 bits con signo y 86y

0b00000101y
byte número natural de 8 bits sin signo uy 86uy

0b00000101uy
int16 entero de 16 bits con signo s 86s
uint16 número natural de 16 bits sin signo americana 86us
int

int32
entero de 32 bits con signo l o ninguno 86

86l
uint

uint32
número natural de 32 bits sin signo u o ul 86u

86ul
nativeint puntero nativo a un número natural con signo n 123n
unativeint puntero nativo como un número natural sin signo un 0x00002D3Fun
int64 entero de 64 bits con signo L 86L
uint64 número natural de 64 bits sin signo UL 86UL
single, float32 número de punto flotante de 32 bits F o f 4.14F o 4.14f o infinityf o -infinityf
lf 0x00000000lf
float; double número de punto flotante de 64 bits None 4.14, 2.3E+32, 2.3e+32, infinity o -infinity
LF 0x0000000000000000LF
bigint entero no limitado a representación de 64 bits I 9999999999999999999999999999I
Decimal número fraccionario representado como número de punto fijo o racional M o m 0.7833M o 0.7833m
Char carácter Unicode None 'a' o '\u0061'
String Cadena de Unicode None "text\n"

or

@"c:\filename"

or

"""<book title="Paradise Lost">"""

or

"string1" + "string2"

Vea también Cadenas.
byte carácter ASCII B 'a'B
byte[] Cadena ASCII B "text"B
Cadena o byte[] cadena textual prefijo @ @"\\server\share" (Unicode)

@"\\server\share"B (ASCII)

Literales con nombre

Los valores destinados a ser constantes se pueden marcar con el atributo Literal.

Este atributo tiene el efecto de hacer que un valor se compile como una constante. En el siguiente ejemplo, tanto x como y son valores inmutables, pero x se evalúa en runtime, mientras que y es una constante en tiempo de compilación.

let x = "a" + "b" // evaluated at run-time

[<Literal>]
let y = "a" + "b" // evaluated at compile-time

Por ejemplo, esta distinción es importante al llamar a una función externa, ya que DllImport es un atributo que necesita conocer el valor de myDLL durante la compilación. Sin la declaración [<Literal>], este código no se compilaría:

[<Literal>]
let myDLL = "foo.dll"

[<DllImport(myDLL, CallingConvention = CallingConvention.Cdecl)>]
extern void HelloWorld()

En las expresiones de coincidencia de patrones, los identificadores que comienzan con caracteres en minúsculas siempre se tratan como variables que se van a enlazar, en lugar de como literales, por lo que normalmente se usan mayúsculas iniciales al definir literales.

[<Literal>]
let SomeJson = """{"numbers":[1,2,3,4,5]}"""

[<Literal>]
let Literal1 = "a" + "b"

[<Literal>]
let FileLocation =   __SOURCE_DIRECTORY__ + "/" + __SOURCE_FILE__

[<Literal>]
let Literal2 = 1 ||| 64

[<Literal>]
let Literal3 = System.IO.FileAccess.Read ||| System.IO.FileAccess.Write

Comentarios

Los literales con nombre son útiles para:

  • Coincidencia de patrones sin una cláusula when.
  • Argumentos de atributo.
  • Argumentos de proveedor de tipos estáticos.

Las cadenas Unicode pueden contener codificaciones explícitas que se pueden especificar mediante \u seguido de un código hexadecimal de 16 bits (0000 - FFFF) o codificaciones UTF-32 que se pueden especificar mediante \U seguido de un código hexadecimal de 32 bits que representa cualquier punto de código Unicode (00000000 - 0010FFFF).

No se permite el uso de operadores bit a bit distintos de |||.

Enteros en otras bases

Los enteros de 32 bits con signo también se pueden especificar en formato hexadecimal, octal o binario mediante un prefijo 0x, 0o o 0b, respectivamente.

let numbers = (0x9F, 0o77, 0b1010)
// Result: numbers : int * int * int = (159, 63, 10)

Caracteres de subrayado en literales numéricos

Puede separar dígitos con el carácter de subrayado (_).

let value = 0xDEAD_BEEF

let valueAsBits = 0b1101_1110_1010_1101_1011_1110_1110_1111

let exampleSSN = 123_45_6789

Valores infinitos de punto flotante especiales

Los tipos numéricos de punto flotante float y single tienen valores especiales asociados que representan infinito positivo y negativo.

Valor de F# Tipo de F# Valor de .NET correspondiente
infinity o +infinity float PositiveInfinity
-infinity float NegativeInfinity
infinityf o +infinityf single PositiveInfinity
-infinityf single NegativeInfinity

Estos valores se pueden usar directamente o se devuelven al dividir por un cero de punto flotante o por un número demasiado pequeño para representarlo mediante el tipo especificado. Por ejemplo:

> 1.0/0.0;;
val it: float = infinity

> 1.0/(-0.0);;
val it: float = -infinity

> 1.0/0.00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001
;;
val it: float = infinity