9

F # hat sowohl getippte als auch untypisierte Code-Zitate und ich frage mich, in welchen Anwendungsfällen man sich für eines entscheiden würde?Wann werden typisierte Zitate in F # nicht typisiert?

Ist die Unterscheidung nur Bequemlichkeit und untypisierte und typisierte Zitate sind in jedem Fall umwandelbar oder sind getippte Zitate e. G. eine Untergruppe von denen, die mit untypisierten Zitaten möglich sind?

Gibt es Beispiele, die nur mit typisierten, aber nicht mit untypisierten Zitaten funktionieren - oder umgekehrt?

Antwort

7

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

3

In der Regel Consumers der Angebotsverarbeitung Bibliotheken verwenden typisierte Zitate. Während die Angebotsbearbeitung Autoren mit untypisierten Zitaten arbeiten müssen.

Das heißt, Sie werden oft nicht direkt untypisierte Angebote mit dem Operator (<@@ @@>) erstellen. Um jedoch rekursiv ein Angebot zu bearbeiten, das verschiedene aktive F # -Kernbibliotheksmuster verwendet, z. B. das Modul Quotations.Patterns, arbeiten Sie mit Zitaten in ihrer untypisierten Form.

Beachten Sie, dass Expr<'T>Expr erweitert und nicht wirklich viele Informationen hinzufügen. Das heißt, typisierte Zitate sind eigentlich nur eine Illusion, alle erfassten Metadaten befinden sich im Objekt Expr und sind nur zur Laufzeit verfügbar.

Verwandte Themen