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).