type open name keywords ejemplos types f# programming-languages metaprogramming quotations

types - open - og:type



¿Cuándo favorecer las citas sin tipo sobre las escritas en F#? (2)

En general, recomendaría usar citas escritas cada vez que pueda. Como de costumbre, los tipos le permitirán aplicar estáticamente algunas condiciones de corrección que de lo contrario podrían causar fallas en el tiempo de ejecución. Considerar:

let one = <@@ "one" @@> // exception at runtime let two = <@@ 1 + %%one @@>

Opuesto a

let one = <@ "one" @> // compile time error: the type ''string'' does not match the type ''int'' let two = <@ 1 + %one @>

Además, a veces las citas sin tipo necesitan anotaciones de tipo adicionales en los casos donde las citas escritas no:

// ok let l = <@ [1] @> let l2 = <@ List.map id %l @> // fails at runtime (obj list assumed instead of int list) let l = <@@ [1] @@> let l2 = <@@ List.map id %%l @@> // ok let l = <@@ [1] @@> let l2 = <@@ List.map (id:int->int) %%l @@>

Sin embargo, si está creando algo extremadamente genérico sin las citas, puede que no sea posible usar citas escritas (por ejemplo, porque los tipos no son conocidos de forma estática). En ese sentido, las citas sin tipo le dan más flexibilidad.

También tenga en cuenta que es extremadamente fácil convertir entre citas escritas y no escritas según sea necesario (upcast un Expr<_> a Expr para pasar de mecanografiado a sin tipo, use Expr.Cast para ir al revés).

F # tiene citas de códigos tipeados y sin tipo, y me pregunto cuáles son los casos de uso en los que uno elegiría uno sobre el otro.

¿La distinción es solo la conveniencia y las citas sin tipo y tipadas son convertibles a cada una de ellas en todos los casos o son citas escritas, por ejemplo, un subconjunto de las posibles con citas sin tipo?

¿Hay algún ejemplo que solo funcione con tipeo, pero no con citas sin tipo, o al revés?


Por lo general, los consumidores de las bibliotecas de procesamiento de citas usarán citas escritas a máquina. Mientras que los autores de procesamiento de citas deben trabajar con citas sin tipo.

Es decir, a menudo no creará directamente citas sin tipo usando el operador (<@@ @@>) . Sin embargo, para procesar recursivamente una oferta utilizando varios patrones activos de la biblioteca central F #, como el módulo Citas.Patrones , trabajas con citas en su forma sin tipo.

Tenga en cuenta que Expr<''T> extiende Expr y realmente no le agrega mucha información. Es decir, las citas mecanografiadas son solo una ilusión, todos los metadatos capturados están en el objeto Expr y solo están disponibles en tiempo de ejecución.