simbólicas simbolicas programacion literales definicion constantes f#

f# - programacion - definicion de constantes simbolicas y literales



¿En qué se diferencia[<Literal>] de otras constantes en F# (3)

Estoy un poco confundido por la palabra clave Literal y por qué es necesario en F #.

Al leer los documentos, me parece que [<Literal>] se utiliza para definir una constante, sin embargo, estoy un poco confundido sobre cómo esta constante difiere de todas las demás constantes en F # ..

Los valores que pretenden ser constantes se pueden marcar con el atributo Literal. Este atributo tiene el efecto de hacer que un valor se compile como una constante.

Cuando pienso en una constante, pienso en algo que es inmutable ...

let x = "a" + "b" //this is a immutable value, its value is constant [<Literal>] let y = "a" + "b" //this is also a immutable value, but why is this a special constant?

¿Es porque los valores F # ''normales'' se evalúan perezosamente y el [<Literal>] no se evalúa perezosamente? ¿Es eso lo que quieren decir con ''compilado como constante'' ..? o hay algo mas para eso?


Creo que un mejor ejemplo es lo que sucede en un match .

Esto no hace lo que esperas:

let t = 3 match q with |t -> printfn "this always happens" |_ -> printfn "this never happens" //and produces a compiler warning

por otra parte:

[<Literal>] let t = 3 match q with |t -> printfn "q is 3" |_ -> printfn "q isn''t 3"

Así que aquí como el Literal es una constante de tiempo de compilación, podemos usarlo para la comparación de patrones.


En su ejemplo, x es un valor inmutable que se asigna durante el tiempo de ejecución (pero NO se evalúa con pereza), mientras que y se asigna durante el tiempo de compilación. Como ejemplo,

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

no funcionará, porque DllImport es un atributo y necesita conocer el valor de myDLL durante la compilación. Sin embargo, esto funcionará:

[<Literal>] let myDLL = "foo.dll" [<DllImport(myDLL, CallingConvention = CallingConvention.Cdecl)>] extern void HelloWorld()


Si proviene de C # background, puede pensar en los valores Literal como campos const y los no literales como campos de readonly . Las mismas diferencias se aplican.