Im Allgemeinen würde ich empfehlen, typisierte Zitate zu verwenden, wann immer Sie können. Wie üblich ermöglichen Ihnen die Typen, einige Korrektheitsbedingungen statisch zu erzwingen, die sonst zur Laufzeit Fehler verursachen könnten. Bedenken Sie:
let one = <@@ "one" @@>
// exception at runtime
let two = <@@ 1 + %%one @@>
im Gegensatz zu
let one = <@ "one" @>
// compile time error: the type 'string' does not match the type 'int'
let two = <@ 1 + %one @>
Zusätzlich manchmal nicht typisierten Zitate benötigen zusätzliche Typenannotationen in Fällen, in denen getippt Zitate nicht:
// 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 @@>
Wenn Sie jedoch sind etwas Äußerst Generisches aus Zitaten zu bauen, kann es nicht möglich sein, typisierte Zitate zu verwenden (zB weil die Typen nicht statisch bekannt sind). In diesem Sinne geben untypisierte Zitate mehr Flexibilität.
Beachten Sie auch, dass es extrem einfach zwischen typisierten und nicht typisierten Notierungen konvertieren je nach Bedarf (upcast ein Expr<_>
-Expr
gehen von zu untypisierten getippt, verwenden Expr.Cast
den anderen Weg zu gehen).