2012-05-17 20 views
9

F # tiene citas de código tipeadas y sin tipo, y me pregunto cuáles son los casos de uso donde uno elegiría uno sobre el otro?¿Cuándo favorecer las citas sin tipo en T #?

Es la distinción solo la conveniencia y las citas sin tipo y mecanografiadas son convertibles a cada una en todos los casos o son citas escritas e. gramo. un subconjunto de los posibles con citas sin tipo?

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

Respuesta

7

En general, recomendaría utilizar citas escritas siempre que sea posible. 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. Considere:

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

en contraposición 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 texto adicionales en los casos en que no lo hacen citas escritas:

// 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ás Al construir algo extremadamente genérico sin citas, puede que no sea posible usar citas escritas (p. ej., 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 de convertir entre mecanografiadas y sin tipo citas según sea necesario (upcast un Expr<_> a Expr para pasar de mecanografiado a sin tipo, el uso Expr.Cast a ir a otro lado).

3

Por lo general, consumidores de las bibliotecas de procesamiento de ofertas utilizará citas escritas a máquina. Mientras que el procesamiento de cotización autores necesita trabajar con citas sin tipo.

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

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

Cuestiones relacionadas